一、实验要求:
1. 复习c文件处理内容;
2. 编写myod.c 用myod XXX实现Linux下od -tx -tc XXX的功能;
3. main与其他分开,制作静态库和动态库;
4. 编写Makefile;
5. 提交测试代码和运行结果截图, 提交调试过程截图,要全屏,包含自己的学号信息。
二、实验原理
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字节。在默认条件下,以四个字节为一组输出
三、实验过程
1. 代码部分
myod.c
#include "head.h"
#include <stdio.h>
void main()
{
char name[50];
printf("please input the txtname:");
scanf("%s",name);
ascii(name);
hex(name);
}
ascii.c
#include "head.h"
#include <stdio.h>
void ascii(char *name)
{
FILE *fp;
char ch;
fp = fopen(name, "r");
ch = fgetc(fp);
printf("output the ascii:
");
while(ch != EOF)
{
if(ch == '
')
printf("
");
else
printf("%4d", ch);
ch = fgetc(fp);
}
fclose(fp);
}
hex.c
#include "head.h"
#include <stdio.h>
void hex(char *name)
{
FILE *fp;
char ch;
printf("output the hex:
");
fp = fopen(name, "r");
ch = fgetc(fp);
while(ch != EOF)
{
if(ch == '
')
printf("
");
else
printf("%4x", ch);
ch = fgetc(fp);
}
fclose(fp);
}
head.h
#ifndef HEAD_H
#define HEAD_H
void hex(char *name);
void ascii(char *name);
#endif
2. 新建并输入txt文件
txt文件内容可以随意输入。
3.编译文件并进行运行
编写myod.c 用myod XXX实现Linux下od -tx -tc XXX的功能
4. main与其他分开,制作静态库
gcc -c ascii.c -o ascii.o
gcc -c hex.c -o hex.o
ar rcvs myod.a *.o
gcc myod.c -o myod -L. myod.a
5. main与其他分开,制作动态库,对ascii.c和hex.c制作动态库,然后gcc编译即可。
export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
gcc -shared -fPIC -o myod.so ascii.c hex.c
gcc myod.c myod.so
6. 编写Makefile
test:myod.o ascii.o hex.o gcc myod.o ascii.o hex.o -o test myod.o:myod.c head.h gcc -c myod.c -o myod.o ascii.o:ascii.c head.h gcc -c ascii.c -o ascii.o hex.o:hex.c head.h gcc -c hex.c -o hex.o
修改test.txt文件中的内容,将随机输入的字符改为学好20181211
四、实验遇到的问题及其解决方案
题目要求有ascii码需要16进制形式表示,每次输入都要判断当前字符个数。在这次myod的测试中,我们重新复习了文件的读取等操作,调试时出现了很多问题,myod.a无法添加符号:归档没有索引;运行ranlib以添加一个这种报错信息经过检查发现。
在形成静态库时,误把.o文件写成.c文件,动态库完成时,学习了可以设置程序共享库位置也就是使用 “export LD_LIBRARY_PATH”,相对于之前的直接复制,这样操作只是临时设置变量 LD_LIBRARY_PATH ,下次开机,一切设置将不复存在,多数情况应该使用export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib,我们可以在 ~/.bashrc 或者 ~/.bash_profile 中加入 export 语句,前者在每次登陆和每次打开 shell 都读取一次,后者只在登陆时读取一次。
在此次实验中,我们从文件操作方面复习c语言在linux的操作、静态库和动态库,用%x表示接收16进制等基础知识,在平常中很少接触,这是一种复习和扩展。