资讯专栏INFORMATION COLUMN

了解文件的随机读写,文件类别、文件缓冲区,文件操作知识点补充(接上文)

FleyX / 2370人阅读

摘要:四文件缓冲区标准采用缓冲文件系统处理的数据文件的缓冲文件系统是指系统自动地在内存中为程序中为每一个正在使用的文件,开辟一块文件缓冲区。正因为有缓冲区的存在,语言在操作文件的时候,需要做刷新缓冲区或者在文件操作结束的时候关闭文件

文件的操作

老规矩笔记自取~:文件操作进阶笔记
❤️欢迎喜欢学习C/C++的朋友互关一起努力!!❤️


一、文件的随机读写

1. fseek 定位文件指针函数

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

改变原文件指针指向的位置

int fseek( FILE *stream, long offset, int origin );

参数:文件地址,偏移量,起始位置

这里的起始位置分为

SEEK_CUR 当前位置

Current position of file pointer

SEEK_END 文件字符的末位(最后一个字符的下个位置)

End of file

SEEK_SET 文件起始位置(第一个字符的起始位)

Beginning of file

偏移量右正左负

返回值:成功返回,0

用一段代码感受:

#define _CRT_SECURE_NO_WARNINGS#include #include int main(){	//FILE* fp = fopen("C://Users//yujing wang//Desktop//test.txt", "w");//写入	FILE* fp = fopen("C://Users//yujing wang//Desktop//test.txt", "r");//读取	if (fp == NULL)	{		perror("fopen");		return -1;	}	//fputs("abcde", fp);//写入abc	fseek(fp, 1, SEEK_SET);//第二个字符	printf("%c", fgetc(fp));	fseek(fp, 0, SEEK_CUR);//与上面一样	printf("%c", fgetc(fp));	fseek(fp, -1, SEEK_END);//最后一个字符	printf("%c", fgetc(fp));	fclose(fp);	fp = NULL;	return 0;}

运行结果和想象的一样


2. ftell 当前偏移量函数

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

方便我们知道现在文件指针指向哪个位置

long int ftell ( FILE * stream );

参数:文件地址

返回值:偏移量

还是一段代码搞起~

#include #include int main(){	FILE* fp = fopen("C://Users//yujing wang//Desktop//test.txt", "r");//读取	if (fp == NULL)	{		perror("fopen");		return -1;	}	fseek(fp, 1, SEEK_SET);//指向第二个字符	printf("%ld", ftell(fp));	fclose(fp);	fp = NULL;	return 0;}

结果符合我们的猜想


3. rewind 返回起始位置函数

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

void rewind ( FILE * stream );

参数:文件地址

返回值:NULL


把刚才的代码再加一行

int main(){	FILE* fp = fopen("C://Users//yujing wang//Desktop//test.txt", "r");//读取	if (fp == NULL)	{		perror("fopen");		return -1;	}	fseek(fp, 1, SEEK_SET);//指向第二个字符	rewind(fp);	printf("%ld", ftell(fp));	fclose(fp);	fp = NULL;	return 0;}

运行结果

偏移量变为0了


二、文本文件和二进制文件

? 二进制文件:数据在内存中以二进制的形式存储,如果不加转换的输出到外存

? 文本文件:以ASCII字符的形式存储的文件,如果要求在外存上以ASCII码的形式存储,则需要在存储前转换


一个数据在内存中是怎么存储的呢?

  • 字符一律以ASCII形式存储
  • 数值型数据既可以用ASCII形式存储,也可以使用二进制形式存储
  • 如有整数10000
  • 如果以ASCII码的形式输出到磁盘,则磁盘中占用5个字节(每个字符一个字节)
  • 二进制形式输出,则在磁盘上只占4个字节(VS2013测试)


三、feof 读取结束原因

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

该函数应用于当文件读取结束的时候,判断是读取失败结束,还是遇到文件尾结束

✨feof的用途:是文件读取结束了,判断是不是遇到文件末尾而结束

✨ferror的用途:文件读取结束了,判断是不是遇到错误后读取结束


1. 判断是否读取结束

  1. 文本文件读取是否结束,判断返回值是否为EOF (fgetc)或NULL(fgets)
  • fgetc读取结束返回EOF
  • fgets读取结束返回NULL
  • 其他函数请在c++图书馆中查找或者在MSDN中搜索
  1. 二进制文件的读取结束判断,判断返回值是否小于实际要读的个数
  • fread判断返回值是否小于实际要读的个数。

四、文件缓冲区

ANSIC标准采用“缓冲文件系统”处理的数据文件的

缓冲文件系统是指系统自动地在内存中为程序中为每一个正在使用的文件,开辟一块“文件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓冲区装满缓冲区后才一起送到磁盘上。如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。

如图所示

其实,在之前的学习过程中,就已经接触了内存缓存区

int main(){    int a = 0;    while ((a = getchar()) != EOF)    {        if (("a" <= a && a <= "z") || ("A" <= a && a <= "Z"))        {            printf("YES/n");        }        else        {            printf("NO/n");        }        getchar();//将每次的"/n"除去    }    return 0;}

这里的getchar就是将缓冲区未输出的数,取出来


缓冲区的大小根据C编译系统决定的。

✨正因为有缓冲区的存在,C语言在操作文件的时候,需要做刷新缓冲区(fflush)或者在文件操作结束的时候关闭文件(fclose)


文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/122188.html

相关文章

  • 一些「流与管道」小事

    摘要:管道流的容器,其实就是管道。这就可以让我们达到进程间通信的目的。如果一个进程接收标准输入和执行标准输出,那么我们进行进程间通信的成本将非常的低廉只要把目标进程的重定向到我们这边生成的管道即可。 「流」这个概念在开发中非常常见,在 java 语言里我们熟知InputStream和OutputStream,node 中有WriteStream和ReadStream,cpp 里也有 stre...

    aristark 评论0 收藏0
  • 后端好书阅读与推荐(续三)

    摘要:后端好书阅读与推荐系列文章后端好书阅读与推荐后端好书阅读与推荐续后端好书阅读与推荐续二后端好书阅读与推荐续三这里依然记录一下每本书的亮点与自己读书心得和体会,分享并求拍砖。然后又请求封锁,当释放了上的封锁之后,系统又批准了的请求一直等待。 后端好书阅读与推荐系列文章:后端好书阅读与推荐后端好书阅读与推荐(续)后端好书阅读与推荐(续二)后端好书阅读与推荐(续三) 这里依然记录一下每本书的...

    ckllj 评论0 收藏0
  • 后端好书阅读与推荐(续三)

    摘要:后端好书阅读与推荐系列文章后端好书阅读与推荐后端好书阅读与推荐续后端好书阅读与推荐续二后端好书阅读与推荐续三这里依然记录一下每本书的亮点与自己读书心得和体会,分享并求拍砖。然后又请求封锁,当释放了上的封锁之后,系统又批准了的请求一直等待。 后端好书阅读与推荐系列文章:后端好书阅读与推荐后端好书阅读与推荐(续)后端好书阅读与推荐(续二)后端好书阅读与推荐(续三) 这里依然记录一下每本书的...

    jcc 评论0 收藏0
  • 后端好书阅读与推荐(续三)

    摘要:后端好书阅读与推荐系列文章后端好书阅读与推荐后端好书阅读与推荐续后端好书阅读与推荐续二后端好书阅读与推荐续三这里依然记录一下每本书的亮点与自己读书心得和体会,分享并求拍砖。然后又请求封锁,当释放了上的封锁之后,系统又批准了的请求一直等待。 后端好书阅读与推荐系列文章:后端好书阅读与推荐后端好书阅读与推荐(续)后端好书阅读与推荐(续二)后端好书阅读与推荐(续三) 这里依然记录一下每本书的...

    lauren_liuling 评论0 收藏0
  • Linux 进程间通信:管道

    摘要:微博微信公众号系统技术前言管道是环境中历史最悠久的进程间通信方式。用一个图来说明这个程序的状态就是这样的一个进程自己给自己发送消息这当然不叫进程间通信,所以实际情况中我们不会在单个进程中使用管道。子进程关闭管道的写端,只读管道。 本文由云+社区发表作者:邹立巍 版权声明: 本文章内容在非商业使用前提下可无需授权任意转载、发布。 转载、发布请务必注明作者和其微博、微信公众号地址,以...

    shuibo 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<