2017-02-01 3 views
1

最初の数Nバイトだけを読み取るように以下のコードを修正しようとしています。私も同じことをしたいと思いますが、最後のNバイト数(バイト数Nの前に ' - 'を追加するだけでよいと思います)。私はfgetを使用するのが正しい方法であるかどうかわかりません。UNIXのC:バイト数に基づいたファイルの読み込み/結合

私は私はそれが唯一の最大値であることを読んだことがあるように、その値を変更すると、特定のバイト数を拾うとは思わないが

while(fgets(buffer, 1000, fp) 

1000を変えてみました。

char buffer[1001]; 

int main(int argc, char** argv) { 
    bzero(buffer, sizeof(buffer)); 
    for(int x=1; x<argc; x++) { 
    FILE *fp = fopen(argv[x], "r+"); 
    if (fp) { 
     while(fgets(buffer, 1000, fp)) { 
     printf("%s", buffer); 
     } 
    } else { 
     printf("could not open file %s\n", argv[x]); 
    } 
    } 
} 
+3

*バイト数N *の前に ' - 'を追加するだけでいいと思いますが、それは**愛らしい**ですが間違っています。 [どのようにCのファイルのサイズを決定するのですか?](http://stackoverflow.com/questions/8236/how-do-you-determine-the-size-of-a-file-in-c) –

+2

おそらく、適切な組み合わせの['fread()'](http://pubs.opengroup.org/onlinepubs/9699919799/functions/fread.html)、 ['fwrite()'](http:// pubs .opengroup.org/onlinepubs/9699919799/functions/fwrite.html)、['fseek()'](http://pubs.opengroup.org/onlinepubs/9699919799/functions/fseek.html) –

+0

私はfread fwriteがコンパイルされません。私は間違って何をやっているのか正確には分かりませんが、freadとfwrite.while(fread(バッファ、1、数値、ファイル))の引数としてバッファとファイルを使うことに問題があると思います。 { fwrite 1、数字、ファイル); printf( "%s"、バッファ); } – advan

答えて

0

あなたが最初の1000バイト、ファイルの最後の1000のバイトをしたいと仮定すると、大部分が2000バイト未満のファイルに問題を無視して(それが動作しますが、あなたは異なる結果をお勧めします)、あなたが使用することができます:

#include <stdio.h> 

enum { NUM_BYTES = 1000 }; 

int main(int argc, char **argv) 
{ 
    for (int x = 1; x < argc; x++) 
    { 
     FILE *fp = fopen(argv[x], "r"); 
     if (fp) 
     { 
      char buffer[NUM_BYTES]; 
      int nbytes = fread(buffer, 1, NUM_BYTES, fp); 
      fwrite(buffer, 1, nbytes, stdout); 
      if (fseek(fp, -NUM_BYTES, SEEK_END) == 0) 
      { 
       nbytes = fread(buffer, 1, NUM_BYTES, fp); 
       fwrite(buffer, 1, nbytes, stdout); 
      } 
      fclose(fp); 
     } 
     else 
     { 
      fprintf(stderr, "%s: could not open file %s\n", argv[0], argv[x]); 
     } 
    } 
} 

このコメントで提案されているようにfread()fwrite()fseek()を使用しています。

開かれたファイルを正常に閉じるためにも注意が必要です。ファイルの読み取りと書き込みを行わないため、書き込みアクセス権は要求されません(fopen()への呼び出しで"r+"の代わりに"r"を使用)。

ファイルが1000バイトより小さい場合、fseek()は、負のオフセットにシークしようとするため失敗します。このような場合は、別の1000バイトを読み書きする必要はありません。

私は、sizeof(buffer)またはNUM_BYTESを関数呼び出しで使用するかどうかについて議論しました。私はNUM_BYTESがより良いと判断しましたが、その選択は決定的ではありません - 代わりにsizeof(buffer)を使用するための説得力のある議論があります。

bufferはローカル変数になります。それをゼロにする必要はありません。 fread()によって書き込まれたエントリのみがfwrite()によって書き込まれるため、bzero()によって解決される問題はありません。 (変数がグローバルであったときは、重複していませんでした;静的な持続時間を持つ変数は、デフォルトですべてのバイトがゼロに初期化されています)。

エラーメッセージは標準エラーに書き込まれます。

コードでは、0バイトの読み取りをチェックしません。間違いなく、それはすべきです。

NUM_BYTES(例えば、あなたのプログラムfl19を呼び出し、file1の最初と最後の200のバイトを印刷するfl19 -n 200 file1を使用)パラメータとなる場合は、いくつかの片付けなどのコマンドライン引数の処理を行う必要があります。

関連する問題