在学c语言的时候,我们学习对文件进行读和写,里面知识点比较复杂,今天小编就来详细地讲述一下。
1.C语言的文件类型
我们依照数据文件的存储形式把他们分为文本文件和二进制文件
文本文件又称ASCII文件,里面的数据是字符的形式,在文件输入时通过ASCII码转化为二进制再送入内存,读写速度比较慢,优点是打印时方便,便于阅读和理解。
二进制文件读写时不用进行转换,速度快,比文本文件节省空间。
2.文件读取状态怎么获取
在c语言读写每一个文件时,我们都需要获取一些信息,比如说文件的存储路径等
为了方便我们获取文件的读取状态,标准文件系统为每一个文件定义为结构体类型,命名为FILE,这个结构体变量中包含了读取文件所需要的基本信息,它的定义包含在stdio.h的头文件中
3.文件的读写操作
想要对文件进行读写,就需要用到fopen函数,可以看成file open的简写。
fopen的调用格式:
FILE * fopen ( const char * filename, const char * mode );
上面的filename时你想要读写的文件名,mode是你想要读写的方式。
我给大家介绍一下读写的方式,然后给大家演示一下该如何读写
关于图片中的字符文件和二进制文件在读取时有什么不同,我先跟大家说,他们两个在调用时所使用的函数不同,后面我们还会详细道来。
小编跟大家着重讲一下“r”和“w”的用法,关于“r“,我们在输入文件名时,如果这个文件名不存在就无法读取,系统不会自动给你创建一个新的文件。
但是如果你选择的读写方式是“w”,如果这个文件名不存在,那么系统就会给你自动创建一个新的文件,以你输入的文件命来命名。
这个创建的文件我们是可以查看到的
4.文件读取函数
在对文件进行读写操作时,如何输入和输出呢?C语言为大家提供了几种读写函数
我向大家一一演示函数的使用
int fputc ( int character, FILE * stream );
我刚刚自己测验了一下,发现这个函数的返回值竟然是我们要放进去字母的ASCII值。
int fgetc ( FILE * stream );
这个函数是从文件中取出一个字符
为了验证他是取第一个字符还是取最后一个字符,我多放一个字母进入文件,以便验证。
因为fgetc要在“r”的方式下才能进行读取,所以我们就可以先关闭文件,再选择“r”的读写方式,我们可以看到fetc返回的是第一个字符的ASCII值。
int fputs ( const char * str, FILE * stream );
这个函数是用来把字符串传到文件里面的,系统会依据你给的地址去传字符,直到遇到’\0'
char * fgets ( char * str, int num, FILE * stream );
从文件中读取字符串,num表示你想要读取的数量,该函数可以从文件中读取n-1个字符,并把这些字符存入到指针str所指向的字符数组中,如果成功就会返回str的首地址,失败就返回NULL,需要注意的是,读取n-1个字符后会自动添加‘\0'
那到底读取的字符串是如何放到字符数组中的呢,是按照顺序放?还是直接覆盖第一个呢?
我们可以看到他是非常粗暴的哦,直接覆盖第一个位置开始接收,那如果我要读取的支付长度大于我给定数组的空间,那又会出现什么样的情形呢?
这个嘛猜一猜就能猜到,栈肯定溢出了,直接崩溃哈哈哈
在C语言中,fread()函数和fread()函数读写文件时需要采用二进制的形式,否则会出现问题
size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );
str是一个指针,代表写入数据的存放地址,size代表数据类型所占用的字节数,count代表读写大小为size的数据项的数量,stream为文件指针,指向要写入的文件
我们看到写入文件中的是一些我们看不懂的东西,可能是根据二进制文件翻译过来的吧,小编在想,是不是破译文件的时候就是要读懂这些东西啊,如果有懂得这一方面的,欢迎评论区留言
小编又好奇这个函数返回的是啥了又去试了一下,发现返回的是读取的size大小的数据个数
size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );
str是一个指针,代表读入数据的存放地址,size代表数据类型所占用的字节数,count代表读写大小为size的数据项的数量,stream为文件指针,指向要读取的文件
那么这个函数的返回值是什么就有待大家自己验证了
int fprintf ( FILE * stream, const char * format, ... );
fprintf能够实现文件的格式化输出,所谓格式化,就是我可以设定一种格式,然后按照这种格式把数据存进去
那个stdout是标准输出流,可以输出到我们的屏幕上.
int fscanf ( FILE * stream, const char * format, ... );
其中的参数和上面的fprintf的参数相同
谢谢大家!