要求:
1.复习c文件处理内容
2.编写myod.c 用myod XXX实现Linux下od -tx -tc XXX的功能
3.main与其他分开,制作静态库和动态库
4.编写Makefile
od命令
1.执行结果

2.功能
od命令用于将指定文件内容以八进制、十进制、十六进制、浮点格式或ASCII编码字符方式显示,通常用于显示或查看文件中不能直接显示在终端的字符。od命令系统默认的显示方式是八进制,名称源于Octal Dump。
常见的文件为文本文件和二进制文件。od命令主要用来查看保存在二进制文件中的值,按照指定格式解释文件中的数据并输出,不管是IEEE754格式的浮点数还是ASCII码,od命令都能按照需求输出它们的值。
3.格式
od [<选项><参数>] [<文件名>]
4.常用的命令选项
-t,--format=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字节。
myod分析
要利用myod去实现od命令的功能,但是这个是被简化的od命令,只需要能够显示文件内容的ascll码和16进制码,所以只需要写两个函数就可以完成需求,一个是转16进制并输出,一个是转成ascll码并输出。
遇到的问题
1.与Linux命令下的输出显示不对应
这是一开始我的函数设计的问题,直接printf("%4x")导致了结果和od的不同,因为od命令默认以四字节为一组,因此要做到可以一次打印4个字节就需要采用循环的方式来完成。
'for(k=1;k<=i;k++){
if(k%16!=0&&STR[k]!='\0'){
if(STR[k]!='\n')
{
printf(" %2c",STR[k]);
continue;
}
else{
printf(" \n");
continue;'
且每两行输出一次
2.没有前面的7位数字
前面7位数字是显示在此行之前的字符数,进制采用的是8进制,在网上查阅资料是采用
printf("%06d",size*变量)的方式,加入此代码后,也确实实现了显示字符数的功能
3.发现程序无法显示“\n”的ASCII字符,但linux的od命令可以
有点类似sh脚本中单引号解决的问题一样,这也算是看书得到的成果,因此采取printf("\\n");就可以显示了
代码分析
#include"head.h"
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void od(char STR[1000],int i) // 这是我代码中最为重要的一环
{
int k=1;
int j=0;
int m=0;
int line=0;
printf("%06d ",line); //以0来填充使其表现的与od的结果一致
putchar(STR[0]);
for(k=1;k<=i;k++){
if(k%16!=0&&STR[k]!='\0'){
if(STR[k]!='\n')
{
printf(" %2c",STR[k]); //每两行输出一次就可以形成od中那种交替输出的结果
continue;
}
else{
printf(" \\n");
continue;
//main.c
#include "head.h"
#include<stdlib.h>
#include<stdio.h>
int main(int argc, char *argv[])
{
if(argc<2) exit(1);
FILE *fp;
fp=fopen(argv[1],"rb");
if(fp==NULL) exit(2);
char ch;
char STR[1000];
int i,n;
i=0;
while((ch=fgetc(fp))!=EOF)
{
STR[i]=ch;
i++;
}
STR[i]='\0';
fclose(fp);
od(STR,i);
}
//head.h
ifndef HEAD_H
#define HEAD_H
void od(char STR[],int);
#endif
最终结果展示

以及makefile展示

