还有没有保证fread
会给你你要求的所有字节。它可以减少,这是返回代码的用途。
您需要使用返回代码来计算发送给fwrite
的信息量。
并且返回码的检查也延伸到fopen
调用 - 不保证打开工作。
举例来说,下面的完整程序将尝试高达3K从一个文件复制到另一个:
#include <stdio.h>
#include <errno.h>
int main (void) {
FILE *fp1, *fp2;
char buff[3*1024];
int bytesRead;
// Open both files.
if ((fp1 = fopen ("a.txt", "r")) == NULL) {
printf ("Error %d opening a.txt\n", errno);
return 1;
}
if ((fp2 = fopen ("b.txt", "w")) == NULL) {
printf ("Error %d opening b.txt\n", errno);
fclose (fp1);
return 1;
}
// Transfer only up to buffer size.
if ((bytesRead = fread (buff, 1, sizeof (buff), fp1)) == 0) {
// Check error case.
if (ferror (fp1)) {
printf ("Error reading a.txt\n");
fclose (fp1);
fclose (fp2);
return 1;
}
}
// Attempt transfer to destination file.
if (fwrite (buff, 1, bytesRead, fp2) != bytesRead) {
printf ("Error writing b.txt\n");
fclose (fp1);
fclose (fp2);
return 1;
}
// Close all files to finish up.
fclose (fp1);
fclose (fp2);
return 0;
}
'fread()'* only *如果发生错误或达到文件结尾,则返回一个短项目数。没有必要重试'fread()' - 如果文件达到了,则不再有数据;并且如果发生错误,则文件位置指示符的值是不确定的。这与典型的底层低级函数(如read())形成对比,它可以*返回短读取而不会产生错误。 – caf 2012-04-13 06:01:51