Myod
- 复习c文件处理内容
- 编写myod.c 用myod XXX实现Linux下od -tx -tc XXX的功能
- main与其他分开,制作静态库和动态库
- 编写Makefile
- 提交测试代码和运行结果截图, 提交调试过程截图,要全屏,包含自己的学号信息
- 在博客园发表一篇博客,重点写遇到的问题和解决过程
Linux下od使用
代码思路
首先要读取一个txt文件,然后利用fopen打开文件,用fgetc读取文件内的字符,然后利用printf函数%c,%x进行打印。最初始的构想是这样,这样还未实现上下结构上的对应。
后续修改了一些printf输出的格式,但是距离正确格式还差很远。
初次代码
#include <stdio.h>
void myod(char *filename)
{
FILE *p;
char content;
p=fopen(filename, "r");
content=fgetc(p);
while (content!=EOF)
{
printf("%c ",content);
printf("%x
",content);
content=fgetc(p);
}
}
int main()
{
char file[100];
printf("file's name:
");
scanf("%s",file);
myod(file);
}
后续改进:读取文件大小,然后设置参数,规定一行打印16个然后换行,每4个连续打印。还有每四个打印的时候是逆序的。结果和od命令一致,但是Linux下运行的时候结尾总会有个0,但是在window的CodeBlock下运行结果是没有的。
代码:
#include <stdio.h>
void myod(char *filename, int s)
{
int i,m,x,k;
int count=0;
int count2=0;
int a=0;
int n=0;
int g=1;
FILE *p;
char content;
char c[100];
p=fopen(filename, "r");
while(n<s)
{
content=fgetc(p);
c[n]=content;
n++;
}
while (count<s)
{
for( i=1;i<=4;i++ )
{
k=g*4-1;
for (m=1;m<=4;m++)
{
printf("%x",c[k]);
k--;
count++;
if (count>=s)
{
m=5;
i=5;
g++;
}
}
g++;
printf(" ");
}
printf("
");
for( x=1;x<=16;x++)
{
printf("%c ",c[a]);
count2++;
a++;
if (count2>=s)
{
x=s;
}
}
printf("
");
}
}
int size(char *filename)
{
FILE *p;
p=fopen(filename, "r");
fseek(p,0,SEEK_SET);
int begin = ftell(p);
fseek(p,0,SEEK_END);
int end = ftell(p);
int fileSize = end - begin;
return fileSize;
}
int main()
{
char file[100];
printf("file's name:
");
scanf("%s",file);
int s=size(file);
myod(file,s);
}
把main分开制作静态库、动态库
makefile
遇到的问题及解决方法
刚开始的的代码,printf就直接使用%c和%x可以打印出想要的结果,问题在于输出的格式。要求上面十六进制,四个一组而且一组内是逆序的,还需要一行打印十六进制输出,一行打印字符输出。
- 1.控制每行输出16个,每4个一组,需要两层循环,挨着四个打印完后打印printf(" ")。打印完16个后,换行打印字符。
- 2.两层循环中使用变量k、g实现逆序。令g=1,k=4*g-1,内层循环打印c[k],k--打印出c[3]、c[2]、c[1]、c[0],外层循环g++。
- 3.整个最外层有while()判断是否打印完,如果没有继续进入下一轮打印16个。假如文件内是20个字符,当一轮循环打印16个后,再次进入for循环又会打印16个就超出范围了。所以通过size函数获取文件大小后,在最内层循环内不断判断打印次数count是否>filesize,来控制结束。