20181322 myod实验
一、复习c文件处理内容
先复习一会要用到的c文件处理函数:
1.FILE *fopen(char *filename, char *mode); //用于打开文件
2.int fgetc(FILE *stream);//用于将字符录入数组
3.int fclose( FILE *fp ); //用于关闭文件
二、学习liunx系统中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字节。在默认条件下,以四个字节为一组输出
(4)功能截图
三、代码及运行截图
headmyod.c:主要实现录入文件内容及为输出做预处理
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 #include"head.h" 5 int main() 6 { 7 FILE *fp; 8 int j; 9 fp = fopen("od.txt","r"); 10 if(fp == NULL) 11 { 12 printf("Failure to open file\n"); 13 return 0; 14 } 15 char ch; 16 char string[1000]; 17 char string1[1000]; 18 int i,n; 19 i=1; 20 while ((string[i] = fgetc(fp)) != EOF) 21 { 22 i++; 23 } 24 25 string[i] = '\0'; 26 /* 27 if (i%4==0) 28 { 29 string[i+1] = '\0'; 30 } 31 else 32 { 33 34 for(i=i+1;;i++) 35 { 36 string[i] = ' '; 37 if (i%4==0) 38 { 39 string[i+1]='\0'; 40 break; 41 } 42 43 } 44 } 45 */ 46 //printf("%d\n%c\n",i,string[i]); 47 48 49 char temp; 50 51 for ( j = 1;j < i ; j=j+4) 52 { 53 if((i-1-j)<4) 54 { 55 switch (i-1-j) 56 { 57 case 0: 58 string1[j] = string[j]; 59 break; 60 case 1: 61 string1[j] = string[j+1]; 62 string1[j+1] = string[j]; 63 break; 64 case 2: 65 string1[j] = string[j+2]; 66 string1[j+1] = string[j+1]; 67 string1[j+2] = string[j]; 68 break; 69 case 3: 70 string1[j+3] = string[j]; 71 string1[j+2] = string[j+1]; 72 string1[j+1] = string[j+2]; 73 string1[j] = string[j+3]; 74 break; 75 } 76 } 77 else 78 { 79 string1[j+3] = string[j]; 80 string1[j+2] = string[j+1]; 81 string1[j+1] = string[j+2]; 82 string1[j] = string[j+3]; 83 } 84 } 85 string1[i] = '\0'; 86 od(string,string1,i-1); 87 /* 88 printf("\n"); 89 for ( j = 1; j <= i; j++) 90 { 91 printf("%c",string1[j]); 92 } 93 */ 94 fclose(fp); 95 }
od.c:以od命令的形式输出文件内容
1 #include<stdio.h> 2 #include"head.h" 3 #include<stdlib.h> 4 #include<string.h> 5 void od(char string[1000],char string1[1000],int i) 6 { 7 int j; 8 int m = 1; 9 int count; 10 int num = 0; 11 printf("%07d ",num); 12 for (j = 1;;j++) 13 { 14 if (string[j]=='\0') 15 { 16 printf("\n "); 17 for ( ; m < j; m++) 18 { 19 if(string[m] =='\n') 20 { 21 printf(" \\n"); 22 } 23 else 24 { 25 printf("%4c",string[m]); 26 } 27 } 28 break; 29 } 30 if(i%4==0) 31 { 32 printf("%02x",string1[j]); 33 } 34 else 35 { 36 if(j==(i-i%4)+1) 37 { 38 for(count = 1;count<= 39 (4-i%4);count++) 40 { 41 printf("00"); 42 } 43 44 } 45 printf("%02x",string1[j]); 46 } 47 48 //printf("%02x",string1[j]); 49 if(j%4==0) 50 { 51 if(j%16==0) 52 { 53 printf("\n "); 54 for(; m <= j; m++) 55 { 56 if(string[m] =='\n') 57 { 58 printf(" \\n"); 59 } 60 else 61 { 62 printf("%4c",string[m]); 63 } 64 } 65 printf("\n"); 66 num = num + 4; 67 printf("%07d ",num+j); 68 } 69 else 70 { 71 printf(" "); 72 } 73 } 74 } 75 if (i%16!= 0) 76 { 77 printf("\n"); 78 printf("%07d ",num+j-1); 79 } 80 81 }
head.h:
1 #ifndef HEAD_H 2 #define HEAD_H 3 void od(char string[],char string1[],int); 4 #endif
运行截图:
四、问题及解决
问题一:在liunx系统下od命令在以16进制输出文件内容时,是四个四个倒序输出的,在一开始编写代码,我是以四个四个正序输出。
代码没优化前实现的效果:
od命令的效果:
对比可以发现,以四个为一组,输出顺序刚好相反。
解决方式:新建一个新数组,将原数组里的内容以每四个一组,分别倒序输出的顺序储存到新数组里,值得注意的是,当最后的要排序的数不足四个时,要分情况用不同方式排序。
具体代码:
问题二:当总输出的字符数不能整除于四时,liunx系统会在输出的十六进制数前补零,直至凑够八个数。
代码没优化前实现的效果:
od命令的效果:
解决方式:当总字符数能整除于四时,程序正常输出。若不能整除于四,在程序输出不足四个的最后一组数之前,先输出相应的零以补足八个数。输出零的个数等于(4-总字符数%4)乘于2。
五、静态库、动态库及makefile
静态库:
动态库:
makefile_code:
makefile: