一、实验准备
1.复习c文件处理内容
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()
2.学习Linux下od命令
od [-A 地址进制] [-t 显示格式] 文件名
-A
( 地址进制)按指定的进制显示地址信息:
o:八进制(系统默认值)
d:十进制
x:十六进制
n:不打印位移值
默认情况下,每行开头为当前读取到的字符数的7位八进制表示
-t
指定数据显示的格式:
c:ASCII字符或反斜杠序列(如\n)
d:有符号十进制数
f:浮点数
o:八进制(系统默认值)
u:无符号十进制数
x:十六进制数
二、实验步骤
1. 编写myod.c 用myod XXX实现Linux下od -tx -tc XXX的功能
(1)使用vim编写head.h
#ifndef HEAD_H #define HEAD_H void hex16(char *name); void ascii(char *name); #endif
(2)编辑main函数——myod.c
#include "head.h" #include <stdio.h> void main() { char name[50]; printf("please input the textname:"); scanf("%s", name); ascii(name); hex16(name); }
(3)编辑ascii.c——输出ASCII码的函数
#include "head.h" #include <stdio.h> void ascii(char *name) { FILE *fp; char ch; printf("output the ascii:\n"); fp=fopen(name,"r"); ch=fgetc(fp); while (ch!=EOF) { if (ch=='\n') printf("\n"); else printf("%4d",ch); ch=fgetc(fp); } fclose(fp); }
(4)编辑hex16.c——输出16进制的函数
#include "head.h" #include <stdio.h> void hex16(char *name) { FILE *fp; char ch; printf("output the hex:\n"); fp=fopen(name,"r"); ch=fgetc(fp); while (ch!=EOF) { if(ch=='\n') printf("\n"); else printf("%4x",ch); ch=fgetc(fp); } fclose(fp); }
(5)对编写好的.c文件进行编译
(6)随意编写一个.txt文件,最好包含自己的学号信息
20181318 hello JJY!
(7)运行刚刚生成的可执行目标文件a.out
结论:0的ASCII码为48,紧接着1-9的分别为49-57,发现第一行学号20181318对应的ascii码值正确
a-z对应的ascii码值为97-122,A-Z对应的ascii码值为65-90,空格对应的ascii码值为32,!对应的ascii码值为33,发现第二行的结果正确
test.txt文件中每一个字符对应的ASCII码值对应的16进制结果正确。
遇到的问题:
1.在编写ascii.c和hex16.c文件时,由于C语言对于文件处理这一块的知识比较薄弱,然后忘记了判断文件读取是否到结尾和最后关闭文件,导致输出异常,程序无法正常编译。
解决方法:加一层while循环——while (ch!=EOF)判断文件是否读取到末尾。添加fclose(fp);关闭文件
2.运行程序时无法显示“\n”的ASCII字符及其对应的16进制
解决方法:在代码内手动添加代码,printf(“\n”)。
2. main与其他分开,制作静态库和动态库
(1)静态库
(2)动态库
遇到的问题:在生成共享库要调用他进行编译时,报出图中的错误,无法打开共享文件,即找不到动态库文件libmyod.so。
解决办法:查询资料后,了解到此种情况是程序在运行时,会在/usr/lib和/lib等目录中查找需要的动态库文件。若找到,则载入动态库,否则将提示类似上述错误而终止程序运行。将文件libmyod.so复制到目录/usr/lib中即可解决。
sudo cp libmyod.so /usr/lib
补充资料:动态库的搜索路径搜索的先后顺序是:
1.编译目标代码时指定的动态库搜索路径;
2.环境变量LD_LIBRARY_PATH指定的动态库搜索路径;
3.配置文件/etc/ld.so.conf中指定的动态库搜索路径;//只需在在该文件中追加一行库所在的完整路径如"/root/test/conf/lib"即可,然后ldconfig是修改生效。
4.默认的动态库搜索路径/lib;
5.默认的动态库搜索路径/usr/lib。
3. 编写Makefile
四、实验心得
这次实验给我最大的感触就是基础不牢想往后走真的是太难了。当时学C语言欠下的债现在要自己一点点重新学习,然后才能赶上大家。当时学C语言时基本上就没有学文件这一块,更没有对这方面进行练习,可能唯一得到练习的机会就是计算机实习,但是当时也只是草率的学了一下,把一些最常用的东西仅仅做到了记住然后去使用,但是并没有真正的理解他们,所以半年过去,又把他们给忘记了。这就让我明白只有通过多加练习才能真正的打牢基础!
这次的实验又让我学习了Linux下的一条指令——od。文件在我们进行编程时是经常用到的一种格式,所以学习这些指令可以帮助我们在今后的学习道路中更加顺利!做完这次实验既是对之前学习内容的一次复习,也是对新知识的一次获取。遇到问题不要怕,思考总会解决他们!
参考资料:1. https://www.jianshu.com/p/418e58c666e3——Linux下的od命令
2. https://blog.csdn.net/white_idiot/article/details/52618538——C语言文件处理
3. http://ascii.911cha.com/——ASCII码转换表