MYOD
一、题目要求
1.复习c文件处理内容
2.编写myod.c 用myod XXX实现Linux下od -tx -tc XXX的功能
3.main与其他分开,制作静态库和动态库
4.编写makefile
5.提交测试代码和运行结果截图, 提交调试过程截图,要全屏,包含自己的学号信息
二、实验准备
(一)复习C语言
1)文件是操作系统管理数据的基本单位,一般是指存储在外部存储介质上的有名字的一系列相关数据的有序集合。它是程序对数据进行读写操作的基本对象。
2)根据文件中数据的组织形式的不同,可以把文件分为:文本文件和二进制文件。
- 文本文件:把要存储的数据当成一系列字符组成,把每个字符的 ASCII 码值存入文件中。每个 ASCII 码值占一个字节,每个字节表示一个字符。故文本文件也称作字符文件或 ASCII 文件,是字符序列文件。
- 二进制文件:把数据对应的二进制形式存储到文件中,是字节序列文件。
3)文件访问:
1.打开函数fopen:
FILE * fopen(char *filename, char *mode);
函数参数:
- filename:文件名,包括路径,如果不显式含有路径,则表示当前路径。
- mode:文件打开模式,指出对该文件可进行的操作。常见的打开模式如 “r” 表示只读,“w” 表示只写,“rw” 表示读写,“a” 表示追加写入。
2.关闭函数fclose:
int fclose(FILE *fp);
函数参数:
- fp:已打开的文件指针。
- 返回值:正常关闭,返回否则返回 EOF(-1)。
3.字符输入函数fgetc:
int fgetc (FILE *fp);
函数功能:从文件指针 fp 所指向的文件中输入一个字符。输入成功,返回该字符;已读取到文件末尾,或遇到其他错误,即输入失败,则返回文本文件结束标志 EOF(EOF 在 stdio.h 中已定义,一般为 -1)。
4.字符输出函数fputc:
int fputc (int c, FILE *fp);
函数功能:向 fp 指针所指向的文件中输出字符 c,输出成功,返回该字符;输出失败,则返回 EOF(-1)。
5.字符串输入函数fgets:
char * fgets (char *s, int size, FILE * fp);
参数 fp:可以指向磁盘文件或标准输入设备 stdin。
返回值:读取成功,返回缓冲区地址 s;读取失败,返回 NULL。
函数功能:从 fp 所指向的文件内,读取若干字符(一行字符串),并在其后自动添加字符串结束标志 '\0' 后,存入 s 所指的缓冲内存空间中(s 可为字符数组名),直到遇到回车换行符或已读取 size-1 个字符或已读到文件结尾为止。该函数读取的字符串最大长度为 size-1。
(二)学习Linux下的od命令
Linux od命令用于输出文件内容。
od指令会读取所给予的文件的内容,并将其内容以八进制字码呈现出来。
命令格式:
od [<选项><参数>] [<文件名>]
命令选项:
-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字节。在默认条件下,以四个字节为一组输出
三、实验步骤与结果
(一)编写myod.c 用myod XXX实现Linux下od -tx -tc XXX的功能
1.编写函数:
head.h
#ifndef _HEAD_20181234_H_
#define _HEAD_20181234_H_
void hex(char *n);
void ascii(char *n);
#endif
ascii.c--输出ASCII码
#include "head20181234.h"
#include <stdio.h>
void ascii(char *n)
{
FILE *fp;
char ch;
fp=fopen(n,"r");
ch=fgetc(fp);
printf("ascii:\n");
while(ch!=EOF)
{
if(ch=='\n')
printf("\n");
else
printf("%4d",ch);
ch=fgetc(fp);
}
fclose(fp);
}
hex.c--输出16进制
#include "head20181234.h"
#include <stdio.h>
void hex(char *n)
{
FILE *fp;
char ch;
printf("Hexadecimal numbers:\n");
fp=fopen(n,"r");
ch=fgetc(fp);
while(ch!=EOF)
{
if(ch=='\n')
printf("\n");
else
printf("%4x",ch);
ch=fgetc(fp);
}
fclose(fp);
}
myod.c
#include "head20181234.h"
#include <stdio.h>
void main()
{
char n[50];
printf("input the txtname:");
scanf("%s",n);
ascii(n);
printf("\n");
hex(n);
}
2.新建一个txt文件20181234.txt
20181234 zhuyuexin
3.编译并运行
4.od-tx-tc
5.结果:通过对比ascii表进行验证,结果正确
(二)静态库
(三)动态库
遇到的问题:在生成共享库要调用进行编译时,报错,无法打开共享文件,即找不到动态库文件libmyod.so。
解决办法:将文件libmyod.so复制到目录/usr/lib中即可解决。
sudo cp libmyod.so /usr/lib
查询资料后也可用此方法解决:
export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
gcc -shared -fpic -o libmyod.so hex.c ascii.c
gcc myod.c libmyod.so
(四)makefile
testmyod:ascii.o hex.o myod.o
gcc ascii.o hex.o myod.o -o testmyod
ascii.o:ascii.c head20181234.h
gcc -c ascii.c -o ascii.o
hex.o:hex.c head20181234.h
gcc -c hex.c -o hex.o
myod.o:myod.c head20181234.h
gcc -c myod.c -o myod.o
四、实验总结
1.实验时总是因为找不到文件而报错,究其原因是在写代码时路径或调用名不全,需要改正。
2.这次实验不仅用到了新学的知识,还用到了之前学习过的旧知识,这个时候基础不好的弊端就暴露了出来。为了能顺利的完成实验,我花费了大量的时间去复习C语言文件的处理,但依然掌握额不是很好,仍需努力。在之后的学习中,我要抓紧时间复习曾经遗漏,遗忘的知识,同时认真学习新的知识,真正学懂知识。无论困难是什么,总有办法解决!