C语言进阶--文件操作(2)

这篇博客详细介绍了C语言中的文件随机读写,包括fseek、ftell和rewind函数的使用,并探讨了文本文件与二进制文件的区别。此外,还澄清了feof在文件读取结束判定中的误用,并提供了文件缓冲区处理的解决方案,特别是针对VS2022环境下输入缓冲区的问题。
摘要由CSDN通过智能技术生成

目录

文件的随机读写

函数fseek

 效果如下:

画图分析: 

效果如下:

函数ftell

画图分析: 

效果如下:

函数rewind

效果如下: 

文本文件和二进制文件

简单介绍:

二进制文件:

文件读取结束的判定

被错误使用的feof

利用fgetc的返回值来判断循环是否结束: 

 效果如下:

若是想要判断是因为什么结束的 ,以下是文本文件的例子

效果如下: 

二进制文件的例子: 

 效果如下:

文件缓冲区

在低版本vs可以用fflush 

VS2022 WIN11环境下测试的一段代码 

效果如下: 

下面我们给出一个解决方案 

 在VS2022 WIN11环境下,使用rewind(stdin)可以解决问题,效果如下:

如果深入了解scanf的用法也可以解决


文件的随机读写

注明:点击函数可以跳转cplusplus网站!!! 

函数fseek

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

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

#include<stdio.h>
int main()
{
	FILE* pf = fopen("text.txt", "r	");
	if (pf == NULL)
	{
		perror(pf);
		return;
	}
	//读文件
	//fgetc返回指定流的内部文件位置指示符当前指向的字符,然后,内部文件位置指示器将前进到下一个字符。
	int ch = fgetc(pf);
	printf("%c", ch);//a
	ch = fgetc(pf);
	printf("%c", ch);//b
	ch = fgetc(pf);
	printf("%c", ch);//c
	ch = fgetc(pf);
	printf("%c", ch);//d
	ch = fgetc(pf);
	printf("%c", ch);//e


	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

 

 

 效果如下:

 现在指示器已经在f的位置,如果我们想要打印c,而不是按顺序读下去。那么就要用fseek

 

 

 

#include<stdio.h>
int main()
{
	FILE* pf = fopen("text.txt", "r");
	if (pf == NULL)
	{
		perror(pf);
		return;
	}
	//读文件
	//fgetc返回指定流的内部文件位置指示符当前指向的字符,然后,内部文件位置指示器将前进到下一个字符。
	int ch = fgetc(pf);
	printf("%c", ch);//a
	ch = fgetc(pf);
	printf("%c", ch);//b
	ch = fgetc(pf);
	printf("%c", ch);//c
	ch = fgetc(pf);
	printf("%c", ch);//d
	ch = fgetc(pf);
	printf("%c", ch);//e

	//fseek(pf, 2, SEEK_SET);//起始位置开始
	fseek(pf, -3, SEEK_CUR);//当前位置开始
	//fseek(pf, -5, SEEK_END);//末尾开始

	ch = fgetc(pf);
	printf("%c", ch);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

画图分析: 

 

 

效果如下:

 

 

函数ftell

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

long int ftell ( FILE * stream );

#include<stdio.h>
int main()
{
	FILE* pf = fopen("text.txt", "r");
	if (pf == NULL)
	{
		perror(pf);
		return;
	}
	//读文件
	//fgetc返回指定流的内部文件位置指示符当前指向的字符,然后,内部文件位置指示器将前进到下一个字符。
	int ch = fgetc(pf);
	printf("%c", ch);//a
	ch = fgetc(pf);
	printf("%c", ch);//b
	ch = fgetc(pf);
	printf("%c", ch);//c
	ch = fgetc(pf);
	printf("%c", ch);//d
	ch = fgetc(pf);
	printf("%c", ch);//e

	int a=ftell(pf);
	printf("%d", a);

	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

画图分析: 

 

当前指向的是f,相对于起始位置的偏移量为5 

效果如下:

 

 

 

函数rewind

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

void rewind ( FILE * stream );

 

#include<stdio.h>
int main()
{
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱敲爱骑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值