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:

 

 

posted @ 2020-10-09 00:17  睿智的河水  阅读(122)  评论(0编辑  收藏  举报