2012-04-13 26 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()' *のみ*は、エラーが発生した場合やファイルの終わりに達した場合に短い項目数を返します。 'fread()'を再試行する必要はありません。ファイルの終わりに達するとそれ以上のデータはありません。エラーが発生した場合、ファイル位置インジケータの値は不定です。これは、 'read()'のような基本的な低レベル関数とは対照的です。* read *はエラーなしで短い読み込みを返すことができます。 – caf

3

fflush(fp2)またはfclose(fp2)は、保留中のバッファされたバイトをディスクに移動します。

+0

あなたはそのfwriteのがfflushはせずに、常に信頼性がないと言うか、fcloseはする意味ですか? –

+0

'fwrite()'は信頼できますが、プログラムの大部分の使用のために、全体的な効率化のためにデフォルトでバッファリングが行われます。もしあなたがやっていることがバッファリングを必要としないならば、ファイルをオープンした後に 'setbuf()'を使ってバッファリングを無効にすることができます。 – wallyk

+2

@ajaybidari:プロセスが正常に終了した場合(main()またはexit()を呼び出すと)、未書き込みのバッファリングされたデータを持つすべてのオープンストリームがフラッシュされ、開いているストリームはすべて閉じられます。 'fflush()'や 'fclose()'であっても、オペレーティングシステムによってバッファリングされる可能性があるので、OSクラッシュ後にOS固有の同期関数を呼び出さなくても耐久性がない場合があります。 – caf

関連する問題