一、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去判断。