C语言文件输入输出应注意的问题

本文深入探讨了fread与fwrite函数如何匹配使用,详细解释了fread的返回值含义及其在文件读取循环中的作用,同时阐述了如何利用feof判断文件末尾。此外,还解析了fseek函数的返回值特性,尤其是在文件操作中的特殊应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、fread与fwrite:
1、两者怎么匹配:
首先讲一下fread的返回值,其返回的是实际读取的数据块(从上一次fp文件流的位置到本次文件流的位置间隔的数据块)的数目。也就是说
size_t fread( void *restrict buffer, size_t size, size_t count,FILE *restrict stream );返回的不是读取的数据大小(realsize *realcount)而是数据块的大小(realcount),还有就是当读取的文件流到了文件的末尾时,fread就不会继续更新fp的buffer中的内容了,也就是说如果你用一个字符数组words当做文件数据中转的地方,用循环(暂且不加任何条件限制)在读到文件末尾之后它每次从文件的buffer中所读取的数据都是一样的。这时如果需要在读到文件末尾时终止对文件的操作就可以使用其返回值或者feof来判断了,具体如下:
1)使用fread的返回值终止读取文件(假设所有变量已声明)

while(bytes = fread(words,sizeof(char),BUFSIZE,fp))
{
	(Do something like:)
	fwrite(words,sizeof(char),bytes,stdout);
}

2)使用feof判断:

bytes = fread(words,sizeof(char),BUFSIZE,fp);
while(feof(fp) != 0)
{
	(Do something like:)
	fwrite(words,sizeof(char),BUFSIZE,stdout);
	bytes = fread(words,sizeof(char),BUFSIZE,fp);
}
fwrite(words,sizeof(char),bytes,stdout);

二、fseek的返回值问题
我们知道fseek在定位文件流的位置时,只要不越界就会返回0,但是不是只要越界就会返回非0值呢,道理上来说应该是这样,但编译器给出了我们的定义是:向前越界返回-1,向后越界依然返回0.这是不是就不能用了呢?其实之所以返回值这么定义,正是为了它的一方面的应用:
假如你希望在每次更改文件时都会依据上一次写入的数据块的内容来写本次数据块,例如我想要输入球员编号,姓名,输入序号…那么输入序号就可以利用fseek找到上次结束时的序号,依此来定义即将输入的序号,但如果这是首次输入呢,就可以利用fseek的返回值去实现了,类似if else 语句。当然,你也可以使用feof去判断。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值