• C语言实现Linux命令——od


    C语言实现Linux命令——od

    实现要求:

    • 复习c文件处理内容
    • 编写myod.c 用myod XXX实现Linux下od -tx -tc XXX的功能
    • main与其他分开,制作静态库和动态库
    • 编写Makefile
    • 提交测试代码和运行结果截图, 提交调试过程截图,要全屏,包含自己的学号信息

    linux下od命令的使用

    • 作用:格式化输出文件中的数据
    • 说明:常见的文件为文本文件二进制文件。此命令主要用来查看保存在二进制文件中的值。比如,程序可能输出大量的数据记录,每个数据是一个单精度浮点数。这些数据记录存放在一个文件中,如果想查看下这个数据,这时候od命令就派上用场了。od命令主要用来格式化输出文件数据,即对文件中的数据进行无二义性的解释。不管是IEEE754格式的浮点数还是ASCII码,od命令都能按照需求输出他们的值。
    • 格式:od [<选项><参数>] [<文件名>]
    • 常用的命令选项:
    1. A<RADIX>,--address-radix=RADIX:选择以何种基数表示地址偏移;
    2. -j<BYTES>,--skip-bytes=BYTES:跳过指定数目的字节;
    3. -N,--read-bytes=BYTES:输出指定字节数;
    -S<BYTES>, --strings[=BYTES]:输出长度不小于指定字节数的字符串;
    4. -v,--output-duplicates:输出时不省略重复的数据; 
    5. -w<BYTES>,--width=<BYTES>:设置每行显示的字节数,od默认每行显示16字节。如果选项--width不跟数字,默认显示32字节;
    6. -t<TYPE>,--format=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字节。
    --help:在线帮助; 
    --version:显示版本信息。
    
    

    设计思路:

    • 要实现的od -tc -tx1 XXX命令,-tc表示输出ASCII字符,-tx1表示以十六进制输出,每组输出一字节。
    • 利用printf函数的输出控制字符串的控制代码,可以方便输出字符变量的ASCII值。
    • 通过控制转换说明符来规定输出形式
    显示ASCII字符的代码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);
    }
    
    
    主函数代码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);
    }
    
    用myod XXX实现Linux下od -tx -tc XXX的功能代码运行截图:

    静态库实现过程及截图:

    ar cr MyOD.a hex.o ascii.o
    gcc -o MyOD MyOD.c ./MyOD.a

    动态库实现过程及截图:

    gcc shared -fpic -o MyOD.so ascii.c hex.c
    gcc -o MyOD2 MyOD.c ./MyOD.so

    makefile文件制作及运行截图:
    testmymath:MyOD.o hex.o ascii.o
    	 gcc MyOD.o hex.o ascii.o -o testmymath
    MyOD.o:MyOD.c head.h
    	gcc -c MyOD.c
    hex.o:hex.c head.h
    	gcc -c hex.c
    ascii.o:ascii.c head.h
    	gcc -c ascii.c
    

    出现的问题:

    最初编写的时候没有考虑输出宽度的问题,运结果数字堆叠到一起。

    • 有两种方式修改:printf("%4x",ch) or printf("%x ",ch)

    运行Makefile文件时出现的问题: 修改代码,将录入的空格键换成TAB录入。

  • 相关阅读:
    JDK、J2EE、J2SE、J2ME的区别
    消息队列
    Unity3D 导入aar注意事项
    汇编小结
    构造函数语意学--笔记
    androidStudio 改包名
    新手用车
    北京临牌办理与续办
    h5+
    apache.http.MalformedChunkCodingException: Chunked stream ended unexpectedly
  • 原文地址:https://www.cnblogs.com/yangdi0420/p/7614069.html
Copyright © 2020-2023  润新知