文件操作2❤

一:文件的顺序读写

1:顺序读写函数

cpp 复制代码
函数名   功能              适⽤于
fgetc   字符输⼊函数       所有输⼊流
fputc   字符输出函数       所有输出流
fgets   ⽂本⾏输⼊函数     所有输⼊流
fputs   ⽂本⾏输出函数     所有输出流
fscanf  格式化输⼊函数     所有输⼊流
fprintf 格式化输出函数     所有输出流
1.1》fgetc
cpp 复制代码
fgetc
int fgetc ( FILE * stream );

作用;从流中读取字符,即从stream中做指定的文件中取得一个字符且取完一个字符后,stream会自动向下移动一个字节。

返回值:返回所得到的字符,如果读入失败,返回EOF。

1.2》fputc
cpp 复制代码
fputc
int fputc ( int character, FILE * stream );

作用:将单个字符写入文件,将一个字符输出到流。

返回值:如果成功就写入那个字符,如果失败,EOF.

1.3》fgets
cpp 复制代码
fgets
char * fgets ( char * str, int num, FILE * stream )
        这里的char*str表示指向复制读取的字符串的char数组的指针。用于存储读取到的字符串。
        num表示要复制str中的最大字符串(包括终止空字符)。表示最大读取的字符数。
        最后一个则是标识输入流的FILE对象的指针。指定要读取的文件流。

fgets函数会将读取的字符串储存到第一个参数指定的字符数组中,并返回该字符数组的地址。如果读取成功,则会返回字符数组的地址;如果失败,(例如遇到文件结束符或者发生错误)则返回NULL。

1.4》fputs
cpp 复制代码
fputs
int fputs ( const char * str, FILE * stream );

作用:向指定的文件写入字符串

str:字符串

stream:文件指针,成功返回非负值,失败返回EOF。

1.5》fscanf
cpp 复制代码
int fscanf ( FILE * stream, const char * format, ... );

作用:将FILE文件流中的数据读写出来。当遇到空格和换行时结束。

1.6》fprintf
cpp 复制代码
int fprintf ( FILE * stream, const char * format, ... );

作用:将格式化的数据,输入到一个流中。

二:文件的随机读取

1:fseek

根据文件指针的位置和偏移量来定位文件指针。

cpp 复制代码
int fseek ( FILE * stream, long int offset, int origin );
第一个参数为流,第二个是偏移量,第三个是文件指针定位的位置。

SEEK_SET以文件开头为中心

SEEK_CUR是文件指针的当前位置为中心

SEEK_END文件结尾为中心。

有了fseek函数,可以随心所欲的让文件指针指向想要的位置,以便获得想要的文件内容。

2:ftell

返回文件指针相对于起始位置的偏移量.

cpp 复制代码
long int ftell ( FILE * stream );

这个比较简单就不再详细介绍了。

3:rewind

让文件指针的位置回到文件的起始位置

cpp 复制代码
void rewind ( FILE * stream );

同上。

三:文件读取结束的判定

feof是我们的主角。下面我们将详细介绍关于feof的知识。

首先牢记:在文件读取过程中,不能用feof函数的返回值直接来判断文件的是否结束。

feof 的作用是:当文件读取结束的时候,判断是读取结束的原因是否是:遇到文件尾结束。

其次判断文本文件读取是否结束,判断返回值是否为 EOF ( fgetc ),或者 NULL ( fgets ) 例如: • fgetc 判断是否为 EOF . • fgets 判断返回值是否为 NULL .

二进制文件的读取结束判断,判断返回值是否小于实际要读的个数。

四:文件缓冲区

ANSIC 标准采用"缓冲文件系统"处理的数据文件的,所谓缓冲文件系统是指系统自动地在内存中为 程序中每⼀个正在使用的文件开辟一块"文件缓冲区"。从内存向磁盘输出数据会先送到内存中的缓 冲区,装满缓冲区后才⼀起送到磁盘上。如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓冲区的大小根据C编译系统决定的。

下面我们可以看一个例子,来进一步了解。

cpp 复制代码
#include <stdio.h>
#include <windows.h>
//VS2019 WIN11环境测试
int main()
{
 FILE*pf = fopen("test.txt", "w");
 fputs("abcdef", pf);//先将代码放在输出缓冲区
 printf("睡眠10秒-已经写数据了,打开test.txt⽂件,发现⽂件没有内容\n");
 Sleep(10000);
 printf("刷新缓冲区\n");
 fflush(pf);//刷新缓冲区时,才将输出缓冲区的数据写到⽂件(磁盘)
 //注:fflush 在⾼版本的VS上不能使⽤了
 printf("再睡眠10秒-此时,再次打开test.txt⽂件,⽂件有内容了\n");
 Sleep(10000);
 fclose(pf);
 //注:fclose在关闭⽂件的时候,也会刷新缓冲区
 pf = NULL;
 return 0;
}

这里可以得出⼀个结论: 因为有缓冲区的存在,C语言在操作文件的时候,需要做刷新缓冲区或者在文件操作结束的时候关闭文件。如果不做,可能导致读写文件时有问题 。

相关推荐
Theodore_10223 小时前
4 设计模式原则之接口隔离原则
java·开发语言·设计模式·java-ee·接口隔离原则·javaee
网易独家音乐人Mike Zhou3 小时前
【卡尔曼滤波】数据预测Prediction观测器的理论推导及应用 C语言、Python实现(Kalman Filter)
c语言·python·单片机·物联网·算法·嵌入式·iot
----云烟----5 小时前
QT中QString类的各种使用
开发语言·qt
lsx2024065 小时前
SQL SELECT 语句:基础与进阶应用
开发语言
开心工作室_kaic5 小时前
ssm161基于web的资源共享平台的共享与开发+jsp(论文+源码)_kaic
java·开发语言·前端
向宇it5 小时前
【unity小技巧】unity 什么是反射?反射的作用?反射的使用场景?反射的缺点?常用的反射操作?反射常见示例
开发语言·游戏·unity·c#·游戏引擎
武子康5 小时前
Java-06 深入浅出 MyBatis - 一对一模型 SqlMapConfig 与 Mapper 详细讲解测试
java·开发语言·数据仓库·sql·mybatis·springboot·springcloud
转世成为计算机大神6 小时前
易考八股文之Java中的设计模式?
java·开发语言·设计模式
搬砖的小码农_Sky6 小时前
C语言:数组
c语言·数据结构
宅小海6 小时前
scala String
大数据·开发语言·scala