• MyOD实验 20181308


    一、实验准备

    1.复习c文件处理内容  

    1. 文件:能够存储数据的存储设备,文件其实是一系列的字节。文件通常存储到硬盘上。

    2. 文件中的位置:文件有开头和结尾,还有一个当前位置,通常定义为从文件头到当前位置有多少个字节。

    3. 文件流:流是外部数据或数据目的地的抽象表示,所以键盘、显示器上的命令行和磁盘文件都是流。

    将数据写入流(即磁盘文件)有两种方式。

    • 可以将数据写入文本文件,此时数据写入为字符,这些字符组织为数据行,每一行都用换行符结束。
    • 可以将数据写入二进制文件。无论将数据写入文本文件还是二进制文件,不论它们是什么样的数据,这些数据最终都是一系列字节。

    4. 文件访问:

    • 打开文件:fopen() 

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

    第一个变元是字符串指针,它是要处理的外部文件名称,它包含了文件名称字符串的地址。第二个变元也是一个字符串,称为文件模式,它指定对文件进行什么处理。

    • 关闭文件:fclose() 

    fcloseFILE *fp );

    返回值:如果成功关闭文件,就返回0,否则返回EOF。

    • 写入文本文件:fputc()——将一个字符写入文本文件

    fputc(int ch,FILE *pfile);

    参数:将第一个变元指定的字符写入第二个变元(文件指针)指定的文件中。

    返回值:如果操作成功,就返回写入的字符,否则返回EOF

    • 读取文本文件:fgetc()
    int mchar = fgetc(pfile);
    fgetc()函数从打开的文本文件中读取一个字符。它将文件指针作为唯一的变元,把读取的字符返回int类型。
    返回值:mchar变量int类型,因为如果到达文件尾,就返回EOF。
     

    2.学习Linux下od命令

     功能:以指定格式查看文件内容。可以以八进制、十进制、十六进制和ASCII码的格式来显示文件或者流,它们对于访问或可视地检查文件中不能直接显示在终端上的字符(如换行符等)很有用。此外,在一些有空洞的文件中可以通过od命令查看空洞的位置。
    使用格式:
    od [-A 地址进制] [-t 显示格式] 文件名

    -A ( 地址进制)按指定的进制显示地址信息:
    o:八进制(系统默认值)
    d:十进制
    x:十六进制
    n:不打印位移值

    默认情况下,每行开头为当前读取到的字符数的7位八进制表示

    -t 指定数据显示的格式:

    c:ASCII字符或反斜杠序列(如
    )
    d:有符号十进制数
    f:浮点数
    o:八进制(系统默认值)
    u:无符号十进制数
    x:十六进制数

    二、实验步骤

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

    (1)使用vim编写head.h

    void hex16(char *name);
    void ascii(char *name);

    (2)编辑main函数——myod.c

    #include "head.h"
    #include <stdio.h>
    
    void main()
    {
        char name[50];
        printf("please input the textname:");
        scanf("%s", name);
        ascii(name);
        hex16(name);
    }

    (3)编辑ascii.c——输出ASCII码的函数

    #include "head.h"
    #include <stdio.h>
    
    void ascii(char *name)
    {
        FILE *fp;
        char ch;
        printf("output the ascii:
    ");
        fp=fopen(name,"r");
        ch=fgetc(fp);
        while (ch!=EOF)
        {
            if (ch=='
    ')
                printf("
    ");
            else
                printf("%4d",ch);
                ch=fgetc(fp);
            
        }
        fclose(fp);
    }

    (4)编辑hex.c——输出16进制的函数

    #include "head.h"
    #include <stdio.h>
    
    void hex(char *name)
    {
        FILE *fp;
        char ch;
        printf("output the hex:
    ");
        fp=fopen(name,"r");
        ch=fgetc(fp);
        while (ch!=EOF)
        {
            if(ch=='
    ')
                printf("
    ");
            else
                printf("%4x",ch);
                ch=fgetc(fp);
            
        }
        fclose(fp);
    }

    (5)对编写好的.c文件进行编译

    提前写好对应txt文件,可包含学号信息。

    通过编译与a.out得到结果ascii码对应正确。

    2. main与其他分开,制作静态库和动态库

    (1)静态库

    (2)动态库

     动态库忘记截图了,所以截了一张已经成功的。

    遇到的问题:在生成共享库要调用他进行编译时,报出图中的错误,无法打开共享文件,即找不到动态库文件libmyod.so。

    解决办法:查询资料后,了解到此种情况是程序在运行时,会在/usr/lib和/lib等目录中查找需要的动态库文件。若找到,则载入动态库,否则将提示类似上述错误而终止程序运行。将文件libmyod.so复制到目录/usr/lib中即可解决。

    sudo cp libmyod.so /usr/lib

    补充资料:动态库的搜索路径搜索的先后顺序是:

    1.编译目标代码时指定的动态库搜索路径;

    2.环境变量LD_LIBRARY_PATH指定的动态库搜索路径;

    3.配置文件/etc/ld.so.conf中指定的动态库搜索路径;//只需在在该文件中追加一行库所在的完整路径如"/root/test/conf/lib"即可,然后ldconfig是修改生效。

    4.默认的动态库搜索路径/lib;

    5.默认的动态库搜索路径/usr/lib。

    3. 编写Makefile 

    四、实验心得

    这次实验难度不是很低,所以第一时间是找到了学长的成果,并且想要全抄照搬,但是出现了很多bug和不理解的地方。所以开始认真起来对待这次实验,并且在其中寻找到了很多可以学习的地方。

  • 相关阅读:
    系统机制 。。(p118p128)
    POJ3371Flesch Reading Ease
    POJ2187Beauty Contest
    POJ3096Surprising Strings
    POJ3393Lucky and Good Months by Gregorian Calendar
    POJ3007Organize Your Train part II
    POJ1027The Same Game
    POJ1696Space Ant
    POJ1584A Round Peg in a Ground Hole
    POJ1472Instant Complexity
  • 原文地址:https://www.cnblogs.com/King-King/p/13800037.html
Copyright © 2020-2023  润新知