课后选做题-MyOD-20181325

od命令的了解

  • 功能

       我先在网络上对od命令相关知识进行了了解,主要是参照以下网站:https://www.runoob.com/linux/linux-comm-od.html,https://baike.baidu.com/item/OD/13384490?fr=aladdin。Linux od命令用于输出文件内容,od指令会读取所给予的文件的内容,并将指定文件内容以八进制、十进制、十六进制、浮点格式或ASCII编码字符方式显示,通常用于显示或查看文件中不能直接显示在终端的字符。od命令系统默认的显示方式是八进制,名称源于Octal Dump。
       常见的文件为文本文件和二进制文件。od命令主要用来查看保存在二进制文件中的值,按照指定格式解释文件中的数据并输出,不管是IEEE754格式的浮点数还是ASCII码,od命令都能按照需求输出它们的值。

  • 语法

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

  • -t的使用

       -t是TypeString 指定输出类型,-t 标志能够进行多次指定,并对于每个指定的类型均写出了输出行。本次作业中的-tx的功能是显示字节为无符号的十六进制,默认四字节为一组显示,-tc的功能是输出对应字符的ASCII码值。

题目要求

  • 复习c文件处理内容

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

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

  • 编写Makefile

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

实验代码

 head.h

#ifndef HEAD_H
#define HEAD_H
void od(char str[],int);
#endif

myod.c  主函数,主要用于打开和关闭文件。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
    FILE *fp;
    fp=fopen("test.txt","rb");
    if(fp==NULL){
        printf("Failure to open file\n");
        return 0;
        }
    char ch;
    char str[100];
    int i,n;
    i=0;
    while((ch=fgetc(fp))!=EOF){
        str[i]=ch;
        i++;
        }
    str[i]='\0';
    fclose(fp);
    od(str,i);//i is number
}

od.c  主要用于实现Linux下od -tx -tc XXX的功能

#include"head.h"
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void od(char str[100],int i)
{
    int k;
    int j=0;
    int m=0;
    int line=0;
    //printf("%06d  ",line);
    //printf("%d",str[0]);
    for(k=0;k<=i;k++){
        if(k%16!=0&&str[k]!='\0'){//ascii
            if(str[k]!='\n')
            {
                printf(" %d",str[k]);
                continue;
            }
            else{
                printf("  \\n");
                continue;
            }
        }
        else{//16
            printf("\n      ");
            for(j=m;j<k;j++){
                printf("  %02x",str[j]);
            }
            printf("\n%06d",k+2);
            printf("  %d",str[k]);
            m=k;
        }
    }
    printf("\n");
}

相关截图

  • 文本文件

 

  • 编译

  • 静态库

  • 动态库

  • Makefile

遇到的问题

        由于已经大致了解了该指令的功能,因此编写代码时更加的方便,由于我无法做到原内容、ASCII码值、16进制值分成3行对应排列,我便只采用了表示ASCII码值、16进制值。在编译过程中,为了使第一行不用空行,我在k的初值处最开始设置的为1,数组第一个字符的表示则循环体之前表示,但是我发现这样做反而会使得第十七个字符无法表示其ASCII码值,因此我又将代码进行了一下修改,最后如图所示在本没有字符的一行多了一个0,目前我还未解决。

心得体会

这个选做让我对Linux中的命令有了新的理解,但是我的代码编写仍有待提高。

posted @ 2020-10-11 15:28  20181325张雯  阅读(78)  评论(0编辑  收藏  举报