Myod 选做
一、题目要求
- 1、复习c文件处理内容
2、编写myod.c 用myod XXX实现Linux下od -tc -tx XXX的功能
3、main与其他分开,制作静态库和动态库
4、编写Makefile
5、提交测试代码和运行结果截图, 提交调试过程截图,要全屏,包含自己的学号信息
6、在博客园发表一篇博客,重点写遇到的问题和解决过程
二、od命令
od命令
用户通常使用od命令查看特殊格式的文件内容。通过指定该命令的不同选项可以以十进制、八进制、十六进制和ASCII码来显示文件。
语法:od [<选项><参数>] [<文件名>]
命令中各选项的含义:
-
A 指定地址基数,包括:
d 十进制
o 八进制(系统默认值)
x 十六进制
n 不打印位移值 -
t 指定数据的显示格式,主要的参数有:
c ASCII字符或反斜杠序列
d 有符号十进制数
f 浮点数
o 八进制(系统默认值为02)
u 无符号十进制数
x 十六进制数
除了选项c以外的其他选项后面都可以跟一个十进制数n,指定每个显示值所包含的字节数。
说明:od命令系统默认的显示方式是八进制,这也是该命令的名称由来(Octal
Dump)。但这不是最有用的显示方式,用ASCII码和十六进制组合的方式能提供更有价值的信息输出。
其中本次作业中需要实现的是:
-tc:输出ASCII字符及反斜杠序列(如\n)
-tx:输出十六进制数
实现指令:myod -tc -tx XXX.txt
三、实现过程
设计思路:
要实现的od -tc -tx1 XXX命令,-tc表示输出ASCII字符,-tx1表示以十六进制输出,每组输出一字节。
利用printf函数的输出控制字符串的控制代码,可以方便输出字符变量的ASCII值。
通过控制转换说明符来规定输出形式。
1)myod.c文件
用于打开测试的txt文件
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(int argv,char *argc[]){
FILE *fp;
fp=fopen(argc[1],"rb");
if(fp==NULL){
printf("Failure to open file\n");
return 0;
}
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);
}
2)od.c文件
调用od.c实现od -tc -tx功能
#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 line = 0;
printf("%06d ", line);
putchar(STR[0]);
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;
}
}
else
{
printf("\n ");
for (j = m; j < k; j++)
{
printf(" %02x", STR[j]);
}
printf("\n%06d", k + 2);
m = k;
}
}
printf("\n");
}
3)头文件head.h
#ifndef HEAD_H
#define HEAD_H
void od(char STR[],int);
#endif
4)结果测试:
Txt文件内容:
Curry_mvp 20191223zjy
程序运行结果:
四、静态库和动态库的创建与实现
静态库:
参照教材39页的内容
动态库:
五、makefile实现
Makefile内容:
结果如图:
六、遇到的问题
-
1、新建的makefile文本文件不能执行
解决:makefile不能有后缀名 -
2、生成链接库文件后,输入文本文件的名称显示not find
解决:需将文本文件和源代码放置同一个文件夹下,否则应加上路径 -
3、优先加载问题
GCC在链接过程中,对参数中的库的顺序是有要求的,参数右侧的库会先于左侧的库加载,也就是说参数的解析是从右往左的。假设库B依赖与库A,则链接的时候要写为:
gcc -o bin B A
如果写为:
gcc -o bin A B
则在B中引用的A中的内容就会无法链接通过
如果在同一目录下,既有静态库又有动态库,则在默认情况下是先加载动态库,因为对gcc来说默认方式是加载动态库,如果要让静态库优先加载的话,则需要加上-static参数