• MyOD实验——20181211


    一、实验要求:

      1. 复习c文件处理内容;

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

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

      4. 编写Makefile;

      5. 提交测试代码和运行结果截图, 提交调试过程截图,要全屏,包含自己的学号信息。

    二、实验原理

    od命令

    1. 功能

    od命令用于将指定文件内容以八进制、十进制、十六进制、浮点格式或ASCII编码字符方式显示,通常用于显示或查看文件中不能直接显示在终端的字符。

    常见的文件为文本文件和二进制文件。od命令主要用来查看保存在二进制文件中的值,按照指定格式解释文件中的数据并输出。

    2. 命令格式

    od [<选项><参数>] [<文件名>]

    3. 命令选项

    -t<TYPE>:指定输出格式,格式包括a、c、d、f、o、u和x,各含义如下:

    • a:具名字符;
    • c:ASCII字符或者反斜杠;
    • d[SIZE]:十进制,正负数都包含,SIZE字节组成一个十进制整数;
    • f[SIZE]:浮点,SIZE字节组成一个浮点数;
    • o[SIZE]:八进制,SIZE字节组成一个八进制数;
    • u[SIZE]:无符号十进制,只包含正数,SIZE字节组成一个无符号十进制整数;
    • x[SIZE]:十六进制,SIZE字节为单位以十六进制输出,即输出时一列包含SIZE字节。在默认条件下,以四个字节为一组输出

     

    三、实验过程

      1. 代码部分

    myod.c

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

    ascii.c

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

    hex.c

    #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);
    }

    head.h

    #ifndef HEAD_H
    #define HEAD_H
    void hex(char *name);
    void ascii(char *name);
    #endif

    2. 新建并输入txt文件

    txt文件内容可以随意输入。

    3.编译文件并进行运行

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

    4. main与其他分开,制作静态库

    gcc -c ascii.c -o ascii.o
    gcc -c hex.c -o hex.o
    ar rcvs myod.a *.o
    gcc myod.c -o myod -L. myod.a

    5. main与其他分开,制作动态库,对ascii.c和hex.c制作动态库,然后gcc编译即可。

    export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
    gcc -shared -fPIC -o myod.so ascii.c hex.c
    gcc myod.c myod.so

    6. 编写Makefile

    test:myod.o ascii.o hex.o
            gcc myod.o ascii.o hex.o -o test
    myod.o:myod.c head.h
            gcc -c myod.c -o myod.o
    ascii.o:ascii.c head.h
            gcc -c ascii.c -o ascii.o
    hex.o:hex.c head.h
            gcc -c hex.c -o hex.o

    修改test.txt文件中的内容,将随机输入的字符改为学好20181211

    四、实验遇到的问题及其解决方案

      题目要求有ascii码需要16进制形式表示,每次输入都要判断当前字符个数。在这次myod的测试中,我们重新复习了文件的读取等操作,调试时出现了很多问题,myod.a无法添加符号:归档没有索引;运行ranlib以添加一个这种报错信息经过检查发现。

      在形成静态库时,误把.o文件写成.c文件,动态库完成时,学习了可以设置程序共享库位置也就是使用 “export LD_LIBRARY_PATH”,相对于之前的直接复制,这样操作只是临时设置变量 LD_LIBRARY_PATH ,下次开机,一切设置将不复存在,多数情况应该使用export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib,我们可以在 ~/.bashrc 或者 ~/.bash_profile 中加入 export 语句,前者在每次登陆和每次打开 shell 都读取一次,后者只在登陆时读取一次。

      在此次实验中,我们从文件操作方面复习c语言在linux的操作、静态库和动态库,用%x表示接收16进制等基础知识,在平常中很少接触,这是一种复习和扩展。

    
    
    
  • 相关阅读:
    《node.js开发指南》读书笔记(一)
    boostrap按钮
    boostrap预定义样式风格
    bootstrap字体图标
    bootstrap初探2
    bootstrap初探
    CSS3 animation
    css3 3D变换和动画
    css3 2D变换 transform
    pandas处理Excel、cvs
  • 原文地址:https://www.cnblogs.com/regina1st/p/13797947.html
Copyright © 2020-2023  润新知