20191302MyOD
MyOD编程
任务要求
-
复习c文件处理内容
-
编写myod.c 用myod XXX实现Linux下od -tx -tc XXX的功能
-
main与其他分开,制作静态库和动态库
-
编写Makefile
-
提交测试代码和运行结果截图, 提交调试过程截图,要全屏,包含自己的学号信息
c文件处理内容复习
od命令详解
-
od指令会读取所给予的文件的内容,并将其内容以八进制字码呈现出来。
-
od命令格式
od [-abcdfhilovx][-A <字码基数>][-j <字符数目>][-N <字符数目>][-s <字符串字符数>][-t <输出格式>][-w <每列字符数>][--help][--version][文件...]
-
参数:
-a 此参数的效果和同时指定"-ta"参数相同。
-A<字码基数> 选择要以何种基数计算字码。
-b 此参数的效果和同时指定"-toC"参数相同。
-c 此参数的效果和同时指定"-tC"参数相同。
-d 此参数的效果和同时指定"-tu2"参数相同。
-f 此参数的效果和同时指定"-tfF"参数相同。
-h 此参数的效果和同时指定"-tx2"参数相同。
-i 此参数的效果和同时指定"-td2"参数相同。
-j<字符数目>或--skip-bytes=<字符数目> 略过设置的字符数目。
-l 此参数的效果和同时指定"-td4"参数相同。
-N<字符数目>或--read-bytes=<字符数目> 到设置的字符数目为止。
-o 此参数的效果和同时指定"-to2"参数相同。
-s<字符串字符数>或--strings=<字符串字符数> 只显示符合指定的字符数目的字符串。
-t<输出格式>或--format=<输出格式> 设置输出格式。
-v或--output-duplicates 输出时不省略重复的数据。
-w<每列字符数>或--width=<每列字符数> 设置每列的最大字符数。
-x 此参数的效果和同时指定"-h"参数相同。
--help 在线帮助。
--version 显示版本信息。 -
openeuler下测试od命令:
C语言实现MyOD
main.c
#include "myodhead.h"
#include<stdio.h>
#include<stdlib.h>
int main(char argv[])
{
FILE *fp;
char args[N],name[N],ch;
int i=0;
printf("please input file name:");
scanf("%s",name);
if((fp=fopen(name,"r"))==NULL){
printf("ERROR!");
exit(0);
}
while(fgets(args,M,fp)){
tx(args,i++);
tc(args);
}
fclose(fp);
}
tc.c
#include "myodhead.h"
#include <stdio.h>
void tc(char args[]){
int i;
printf(" ");
for(i=0;args[i]!='\0';i++)
{
if(args[i]=='\n')
printf("\\n");
else
printf("%4c",args[i]);
}
printf("\n");
}
tx.c
#include "myodhead.h"
#include<stdio.h>
void tx(char args[],int j)
{
int i;
char output[N];
printf("%07o",16*j);
j++;
for(i=0;args[i]!='\0';i++)
{
if(args[i]=='\n')
output[i]='\n';
else
output[i]=args[i];
}
for(i=0;args[i]!='\0';i=i+4)
{
printf(" %x%x%x%x",output[i+3],output[i+2],output[i+1],output[i]);
}
printf("\n");
}
myodhead.h
#ifndef __MYODHEAD_H__
#define __MYODHEAD_H__
#define N 999
#define M 17
void tc(char args[]);
void tx(char args[],int j);
#endif
编译运行
- 编译
gcc -Iinclude -c src/tx.c -o lib/tx.o
gcc -Iinclude -c src/tc.c -o lib/tc.o
- 运行
gcc lib/*.o -Iinclude -o bin/myod
- ./bin/myod
- ./bin/myod
静态库制作
gcc -c -Iinclude src/tc.c src/tc.c -Llib
ar crv lib/libmyod.a lib/*.o
动态库制作
gcc -fPIC -shared -o lib/libmyod.so -Iinclude src/*.c
makefile制作
- Makefile
gdb调试
问题及解决
- 问题:在编译时报错
- 解决:出现问题的原因是我将N作为全局变量放在了myodhead.h中,但未在tx.c中加入#include "myodhead.h",加上后问题解决
- 问题:在运行时显示内容与od命令有差距
- 解决:第一列并不表示文本,所以需要空出来,于是我在main.c文件中,在打印每行前,加入printf(" "),进行补充,结果显示正常