2012-04-13 89 views
0

我想讀取一個文件的內容是一個3KB的緩衝區,然後將緩衝區的內容寫入另一個文件。寫入數據的文件僅包含寫入數據的一部分。它的大小約爲1KB。如何編寫剩餘的數據?從文件讀取和寫入文件是不一樣

fp1 = fopen("a.txt","rb"); 
fp2 = fopen("b.txt","wb"); 

fread(buffer, 1, BUFFER_SIZE,fp1);//reading from file pointed to by fp1 
//BUFFER_SIZE = 3KB 
fwrite(buffer, 1, BUFFER_SIZE, fp2);//writing into a file pointed to by fp2 

fwrite後fflush會爲我做嗎?

回答

0

還有沒有保證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; 
} 
+1

'fread()'* only *如果發生錯誤或達到文件結尾,則返回一個短項目數。沒有必要重試'fread()' - 如果文件達到了,則不再有數據;並且如果發生錯誤,則文件位置指示符的值是不確定的。這與典型的底層低級函數(如read())形成對比,它可以*返回短讀取而不會產生錯誤。 – caf 2012-04-13 06:01:51

3

fflush(fp2)fclose(fp2)會將掛起的緩衝字節移動到磁盤。

+0

你的意思是說,fwrite的永遠是不可靠的,而不fflush或FCLOSE? – 2012-04-13 05:57:04

+0

'fwrite()'是可靠的,但默認情況下,緩衝涉及絕大多數程序使用的整體效率。如果你正在做的不需要緩衝,你可以在打開文件後使用'setbuf()'來禁用緩衝。 – wallyk 2012-04-13 05:59:04

+2

@ajaybidari:注意,如果進程乾淨地退出(通過從main()返回或調用exit()),所有打開的帶有未寫入緩衝數據的流將被刷新,並且所有打開的流將被關閉。請注意,即使使用'fflush()'或'fclose()',寫入操作可能會被操作系統緩衝,因此在系統崩潰後可能不會持久,而不會調用某些特定於OS的同步功能。 – caf 2012-04-13 06:06:03