MyOD

MyOD实验

一、c文件处理内容

1. 文件:能够存储数据的存储设备,文件其实是一系列的字节。文件通常存储到硬盘上。

2. 文件中的位置:文件有开头和结尾,还有一个当前位置,通常定义为从文件头到当前位置有多少个字节。

3. 文件流:流是外部数据或数据目的地的抽象表示,所以键盘、显示器上的命令行和磁盘文件都是流。

将数据写入流(即磁盘文件)有两种方式。

  • 可以将数据写入文本文件,此时数据写入为字符,这些字符组织为数据行,每一行都用换行符结束。
  • 可以将数据写入二进制文件。无论将数据写入文本文件还是二进制文件,不论它们是什么样的数据,这些数据最终都是一系列字节。

4. 文件访问:

打开文件fopen()
fopen FILE *fopen( const char *filename, const char *mode );
说明:FILE *fopen(const char *name,const char *mode);
第一个变元是字符串指针,它是要处理的外部文件名称,它包含了文件名称字符串的地址。第二个变元也是一个字符串,称为文件模式,它指定对文件进行什么处理。
(1)使用文件方式主要有:只读(r)、只写(w)、追加(a),还有配合"+"使用的方式,如r+、w+、a+;
(2)默认打开的文件为文本文件,用't'表示,可以省略。如果打开二进制的文件,则使用'b'。例如:r、rt、rb等;
(3)如果不能实现打开的任务,则函数返回NULL值。

fclose( FILE *fp );
返回值:如果成功关闭文件,就返回0,否则返回EOF。
写入文本文件:fputc()——将一个字符写入文本文件
int fclose( FILE *stream );
说明:
(1)打开文件后,必须要养成关闭文件的好习惯;
(2)如果关闭文件出错,函数返回非零值,否则返回0.可以用ferror函数检查是否出错。

fputc说明:
(1)fputc向文件写入一个字符;
(2)输出成功则返回值就是输出的字符,如果失败则返回一个EOF。

fgetc说明:
(1)fgetc向文件读取一个字符;
(2)函数返回读取的字符,如果遇到文件结尾,则返回EOF;
(3)建议使用feof函数来判断是否文件结束。如果文件结束,函数feof返回值为1,否则为0。

void rewind( FILE *stream );
说明:(1)rewind使文件的位置指针重新定位于文件开头。

fseekint fseek( FILE *stream, long offset, int origin );
说明:
(1)起始点用0、1、2代替,分别表示文件开始SEEK_SET、文件当前位置SEEK_CUR、文件末尾SEEK_END;
(2)位移量指起始点为基点,向前移动的字节数。一般为long型;
(3)fseek常用二进制文件,可以实现随机读写。

二、MyOD

od的具体功能可用man查看

实操一下,功能体现的很直观:od -tc是把文件内容一个字符一个字符输出,od -tx是把文件内容的每个字符的十六进制表示输出

编写myod.c 用myod XXX实现Linux下od -tx -tc XXX 的功能

hex.c

myod.c

asc.c

三、Main与其他分开,制作静态库和动态库

测试文档是我之前写的gcc笔记,为gcc.txt,里面内容比较特殊,就不换成姓名学号了

静态库:

动态库:

四、makefile

遇到的问题

  • 1.在编写ascii.c和hex16.c文件时,由于C语言对于文件处理这一块的知识比较薄弱,然后忘记了判断文件读取是否到结尾和最后关闭文件,导致输出异常,程序无法正常编译。

解决方法:加一层while循环——while (ch!=EOF)判断文件是否读取到末尾。添加fclose(fp);关闭文件

  • 2.运行程序时无法显示“ ”的ASCII字符及其对应的16进制

解决方法:在代码内手动添加代码,printf(“ ”)。

实验心得

这次的实验又让我学习了Linux下的一条指令——od。文件在我们进行编程时是经常用到的一种格式,所以学习这些指令可以帮助我们在今后的生活和工作道路中更加方便顺利。做完这次实验既是对之前学习内容的一次复习,也是对新知识的一次获取。碰见问题不要慌,思考总会解决他们,奥里给!

星光荡开宇宙
原文地址:https://www.cnblogs.com/pogbar/p/15337590.html