• 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目标文件随后我将其编译后即可成功。

  • 相关阅读:
    第5次作业+105032014118+陈元可
    第4次作业类测试代码+105032014118+陈元可
    实验二+118+陈元可
    第三次作业+105032014118
    第一次作业+105032014118
    第二次作业+105032014118
    UT源码105032014118
    ORACLE基本操作
    实验四+074+林盼皇
    实验三+074+林盼皇
  • 原文地址:https://www.cnblogs.com/ruier/p/15334074.html
Copyright © 2020-2023  润新知