MyOD实验
一、实验要求
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. 文件:能够存储数据的存储设备,文件其实是一系列的字节。文件通常存储到硬盘上。
2. 文件中的位置:文件有开头和结尾,还有一个当前位置,通常定义为从文件头到当前位置有多少个字节。
3. 文件流:流是外部数据或数据目的地的抽象表示,所以键盘、显示器上的命令行和磁盘文件都是流。
4. 文件访问:
打开文件:fopen()
FILE *fopen(const char *name,const char *mode);
* 第一个变元是字符串指针,它是要处理的外部文件名称,它包含了文件名称字符串的地址。第二个变元也是一个字符串,称为文件模式,它指定对文件进行什么处理。
关闭文件:fclose()
fclose( FILE *fp );
* 返回值:如果成功关闭文件,就返回0,否则返回EOF。
写入文本文件:fputc()——将一个字符写入文本文件
fputc(int ch,FILE *pfile);
* 参数:将第一个变元指定的字符写入第二个变元(文件指针)指定的文件中。
* 返回值:如果操作成功,就返回写入的字符,否则返回EOF
读取文本文件:fgetc()
int mchar = fgetc(pfile);
* fgetc()函数从打开的文本文件中读取一个字符。它将文件指针作为唯一的变元,把读取的字符返回int类型。
* 返回值:mchar变量int类型,因为如果到达文件尾,就返回EOF。
三、实验步骤及过程
代码部分:
主函数myod.c:
#include "head.h"
#include <stdio.h>
#include <string.h>
void main()
{
char name[50];
strcpy(name,"text.txt");
ascii(name);
hex(name);
}
转换 ASCII 码的函数 ascii.c :
#include "head.h"
#include <stdio.h>
#include <string.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>
#include <string.h>
void hex(char *name)
{
FILE *fp;
char ch;
printf("out 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:
void hex(char *name);
void ascii(char *name);
文本文件test.txt:
hello 20181332 baiyunbang!
makefile:
myodl: main.o ascii.o hex.o
gcc main.o ascii.o hex.o -o myod
main.o: main.c
gcc -c main.c
ascii.o: ascii.c
gcc -c ascii.c
hex.o: hex.c
gcc -c hex.c`
实验过程及截图:
(1)新建想要输出的txt文件;
(2)编写实现代码;
主函数myod.c:
头文件head.h:
转换 ASCII 码的函数 ascii.c :
转换十六进制码的函数hex.c
(3)静态库实现过程:
(4)动态库实现过程:
(5)makeflie实现过程:
四、实验中遇到的问题及解决方法
1. C语言代码的编写较为困难,通过学习有关文件的博客、翻书、百度的方法解决。
2. 在ascii.c中有'/n'输入成"/n"多次编译出错,反复检查后才发现问题。
3. 在编译过程中老是出现段错误:
五、实验心得体会
1. 本次实验难度较高,花费大量时间研究如何做出来。
2. C语言部分代码的实现方法已经忘记,只能重新学习写文件的方法......复习真的很重要!!!!
3. 学会了op命令的使用,可以将指定文件内容以八进制、十进制、十六进制、浮点格式或ASCII编码字符方式显示。
- 参考资料: