课后选做题-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中的命令有了新的理解,但是我的代码编写仍有待提高。