MyOD 20181227李根
实验要求:
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.代码部分
main.c:
#include <stdio.h> #include <stdlib.h> #define N 100 #define M 17 int main(char argv[]) { FILE *fp; char args[N],name[N],ch; int i=0; printf("please input file name:"); gets(name); if((fp=fopen(name,"r"))==NULL) { printf("ERROR!"); exit(0); } while(fgets(args,17,fp)) { ascii(args,i++); hex(args); } fclose(fp); }
hex.c:
#include<stdio.h> void hex(char args[]) { int i; printf(" "); for(i=0;args[i]!='\0';i++) { if(args[i]=='\n') printf("\\n"); else printf("%4c",args[i]); } printf("\n"); }
ascii.c:
#include<stdio.h> void ascii(char args[],int j) { int i; printf("%07o",16*j); j++; for(i=0;args[i]!='\0';i++) { if(args[i]=='\n') printf("%x",'\n'); printf("%4x",args[i]); } printf("\n"); }
makefile:
myodl: main.o ascii.o hex.o gcc main.o ascii.o hex.o -o 1227myod main.o: main.c gcc -c main.c ascii.o: ascii.c gcc -c ascii.c hex.o: hex.c gcc -c hex.c
test.txt:
hello 20181227 li gen
2.具体过程
(1)新建想要输出的txt文件;
(2)编写实现代码;
(3)静态库实现过程:
(4)动态库实现过程:
(5)makeflie实现过程:
实验中遇到的问题及如何解决:
1.在静态库过程中,到最后一步执行 ./myod 时,报错提示没有myod文件,经过检查后发现开始就没有编译成功,在输入命令 gcc -g main.c ascii.c hex.c -o myod后解决了问题。
2.在makefile过程中,输入 make 命令时出现如上图所示报错,在上网查资料之后发现是 makefile 文档前面不应该用空格,而是要用 tab 键,在删掉文档中前面的空格后这个报错便没有了;
但随后有了第二个错误 myod is up to date ,最后将 makefile 文档中 myod 改成 myod1 便解决了该问题。