• myod实验(使用openeuler)


    实验任务:

    1 复习c文件处理内容
    2 编写myod.c 用myod XXX实现Linux下od -tx -tc XXX的功能
    3 main与其他分开,制作静态库和动态库
    4 编写Makefile
    5 遇到的问题和解决过程

    一、c文件处理内容

    fopen FILE *fopen( const char *filename, const char *mode );

    说明:
    (1)使用文件方式主要有:只读(r)、只写(w)、追加(a),还有配合"+"使用的方式,如r+、w+、a+;
    (2)默认打开的文件为文本文件,用't'表示,可以省略。如果打开二进制的文件,则使用'b'。例如:r、rt、rb等;
    (3)如果不能实现打开的任务,则函数返回NULL值。

    fclose int fclose( FILE *stream );

    说明:
    (1)打开文件后,必须要养成关闭文件的好习惯;
    (2)如果关闭文件出错,函数返回非零值,否则返回0.可以用ferror函数检查是否出错。

    fputc

    说明:
    (1)fputc向文件写入一个字符;
    (2)输出成功则返回值就是输出的字符,如果失败则返回一个EOF。

    fgetc

    说明:
    (1)fgetc向文件读取一个字符;
    (2)函数返回读取的字符,如果遇到文件结尾,则返回EOF;
    (3)建议使用feof函数来判断是否文件结束。如果文件结束,函数feof返回值为1,否则为0。

    1rewind void rewind( FILE *stream );

    说明:
    (1)rewind使文件的位置指针重新定位于文件开头。

    fseek int fseek( FILE *stream, long offset, int origin );

    说明:
    (1)起始点用0、1、2代替,分别表示文件开始SEEK_SET、文件当前位置SEEK_CUR、文件末尾SEEK_END;
    (2)位移量指起始点为基点,向前移动的字节数。一般为long型;
    (3)fseek常用二进制文件,可以实现随机读写。

    ftell long ftell( FILE *stream );

    说明:
    (1)函数返回文件当前位置,如果调用出错则返回值为-1L。

    ferror int ferror( FILE *stream );

    说明:
    (1)返回值为0,表示未出错,返回值为1,表示出错;
    (2)同一个文件每一次调用输入输出函数,均产生一个新 的ferror函数值;
    (3)在执行fopen函数时,ferror函数的初始值自动置为0。

    clearerr

    说明:
    (1)使文件错误标志和文件结束标志为0。

    二、编写myod.c 用myod XXX实现Linux下od -tx -tc XXX的功能

    • 编写头文件

    #ifndef __20191307_H__
    #define __20191307_H__
    #include <stdio.h>
    void asc(char *i);
    void hex(char *i);
    #endif
    
    
    • asc.c

    #include "20191307.h"
    #include <stdlib.h>
    #include <stdio.h>
    void asc(char *p)
    {
    FILE *fp;
     char ch;
    printf("asc mode:
    ");
     if((fp = fopen(p, "r")) == NULL)
      {
            printf("File open failed!
    ");
            exit(0);
        }
    while(!feof(fp))
        {
            ch = fgetc(fp);
                    if(ch=='
    ')
                    printf("
    ");
                    else
            printf("%d",ch);
    }
    }
    
    
    • hex.c

    #include <stdio.h>
    #include <stdlib.h>
    void hex(char *p)
    {
    FILE *fp;
    char ch;
    printf("hex mode:
    ");
    if((fp = fopen(p, "r")) == NULL)    {
            printf("File open failed!
    ");
           exit(0);
        }
    while(!feof(fp))
    {
            ch = fgetc(fp);
            if(ch != EOF)
    {
    if(ch=='
    ')
    printf("
    ");
    
    else
    printf("%x",ch);
    
    • main.c

    #include <stdio.h>
    void main()
    {
      char Text[50];
      printf("Enter textname:");
      scanf("%s",Text);
       hex(Text);
      printf("
    ");
    asc(Text);
    }
    

    新建一个文本文件命名为20191307
    20191307
    forty

    用语句将文件编译为.o文件后运行

    运行结果为

    • od -tc -tx

    三、静态库

    ar cr main.a hex.o asc.o
    gcc -o main main.c ./main.a
    

    四、动态库

    gcc -shared -fpic -o myod.so ascii.c hex.c
    gcc -o myod777 myod.c ./myod.so
    

    五、makefile

    20191307wjr:asc.o hex.o main.o
            gcc -o 20191307wjr asc.o hex.o main.o
    asc.o:asc.c 20191307.h
            gcc -c asc.c
    hex.o:hex.c 20191307.h
            gcc -c hex.c
    main.o:main.c 20191307.h
            gcc -c main.c
    clean:
            rm 20191307wjr asc.o hex.o main.o
    

    六、遇到的问题

    首先是在编译过程中出的问题,一开始并没有将asc与hex文件编译成可执行文件,导致主函数无法直接调用这两个文件。没有把函数所在的c文件生成.o目标文件随后我将其编译后即可成功。

  • 相关阅读:
    hlgoj 1766 Cubing
    Reverse Linked List
    String to Integer
    Bitwise AND of Numbers Range
    Best Time to Buy and Sell Stock III
    First Missing Positive
    Permutation Sequence
    Next Permutation
    Gray Code
    Number of Islands
  • 原文地址:https://www.cnblogs.com/ruier/p/15334074.html
Copyright © 2020-2023  润新知