還有沒有保證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