181310_方位 MyOD选作
一、任务说明
1 复习c文件处理内容
2 编写myod.c 用myod XXX实现Linux下od -tx -tc XXX的功能
3. main与其他分开,制作静态库和动态库
4. 编写Makefile
二、实验操作
1.复习c文件处理内容:
编译操作,动态库与静态库的操作以及make程序使用的复习将会在实验步骤中体现,已做回顾。
2.
(1)首先对于所要实现的功能进行前瞻,了解其功能
od -tx -tc test_1310
txt的内容是:
也可以利用man od查看功能:
man od
由此我们可以得出,
od 命令用途是以指定格式显示文件。
常见的文件为文本文件和二进制文件。此命令主要用来查看保存在二进制文件中的值。比如,程序可能输出大量的数据记录,每个数据是一个单精度浮点数。
od使用字符串类型显示文件,来格式化输出。
od [ -v ] [ -A AddressBase ] [ -N Count ] [ -j Skip ] [ -t TypeString ... ] [ File ... ]
具体可查看man od解释
(2)编写需求代码
其中:
需要的第一c文件即:
1 #include"head.h" 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<string.h> 5 void od(char STR[1000],int i) 6 { 7 int k=1; 8 int j=0; 9 int m=0; 10 int line=0; 11 printf("%06d ",line); 12 putchar(STR[0]); 13 for(k=1;k<=i;k++){ 14 if(k%16!=0&&STR[k]!='\0'){ 15 if(STR[k]!='\n') 16 { 17 printf(" %2c",STR[k]); 18 continue; 19 } 20 else{ 21 printf(" \\n"); 22 continue; 23 } 24 } 25 else{ 26 printf("\n "); 27 for(j=m;j<k;j++){ 28 printf(" %02x",STR[j]); 29 } 30 printf("\n%06d",k+2); 31 32 m=k; 33 } 34 } 35 printf("\n"); 36 }
1310_out.c:
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 int main() 5 { 6 7 8 FILE *fp; 9 fp=fopen("test_1310.txt","rb"); 10 if(fp==NULL){ 11 printf("Failure to open file\n"); 12 return 0; 13 } 14 char ch; 15 char STR[1000]; 16 int i,n; 17 i=0; 18 while((ch=fgetc(fp))!=EOF){ 19 STR[i]=ch; 20 i++; 21 //putchar(ch); 22 } 23 STR[i]='\0'; 24 //printf("%d",i); 25 fclose(fp); 26 od(STR,i); 27 }
同时还需要定于head.h:
1 #ifndef HEAD_H 2 #define HEAD_H 3 void od(char STR[],int); 4 #endif
(3)在编译一块,直接利用静态库与动态库进行操作,无需进行直接的编译,由此便也完成了一遍库的学习:
静态库:
1 gcc 181310_od.c -o main -I/home/xfw/ljp/myod_xfw -L. -lod 2 gcc -c -I/home/xfw/ljp/myod_xfw *c 3 gcc 181310_od.c -o main -I/home/xfw/ljp/myod_xfw -L. -lod
动态库:
gcc -fPIC -c -I/home/xfw/ljp/myod_xfw 181310_od.c gcc -shared -o dong.so 181310_od.o sudo cp dong.so /usr/lib
注意此处需要root权限来移动库函数去到lib下
(4)makefile之make程序使用
1 test1310:181310_od.o 1310_out.o 2 gcc -o test1310 181310_od.o 1310_out.o head.h 3 181310_od.o:181310_od.c 4 gcc -c 181310_od.c -o 181310_od.o 5 1310_out.o:1310_out.c 6 gcc -c 1310_out.c -o 1310_od.o 7
调用make:
(5)结果
三、实验问题
1.有关显示问题:但linux的od命令可显示出“\n”,似乎除了必要的操作,该符号一定存在。
解决:手动操作的时候注意转移字符等的特殊符号选取
2.有关缺省问题:在末尾处的ascii码段无法正常显示
解决:有关程序代数参数的调试,需要注意边界条件!
四、实验心得
1.该实验能使得我们对于liunx中一条自带指令有了更深的理解,为什么许多功能指令需要封装,需要给出,其背后都是系统开发者的心血,一条指令如此,上千条指令又该如何?
2.关于设计字符的编程似乎很有难度,这能体现自身的基础不扎实。
3.前面的学习均能用到,算是又熟练了一遍,实验和前面内容成了一个学习系统,这样很好。