あなたが最初の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
を使用)パラメータとなる場合は、いくつかの片付けなどのコマンドライン引数の処理を行う必要があります。
*バイト数N *の前に ' - 'を追加するだけでいいと思いますが、それは**愛らしい**ですが間違っています。 [どのようにCのファイルのサイズを決定するのですか?](http://stackoverflow.com/questions/8236/how-do-you-determine-the-size-of-a-file-in-c) –
おそらく、適切な組み合わせの['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) –
私はfread fwriteがコンパイルされません。私は間違って何をやっているのか正確には分かりませんが、freadとfwrite.while(fread(バッファ、1、数値、ファイル))の引数としてバッファとファイルを使うことに問題があると思います。 { fwrite 1、数字、ファイル); printf( "%s"、バッファ); } – advan