0

こんにちは、バイナリ ファイルを読み取って処理しようとしていますが、fread を使用しようとすると、間違った方法で fread を使用していると思います。読み取られるバイト数は、ファイルのサイズよりも小さくなります。誰か助けてくれませんか、白 私は間違っています

    #include <stdio.h>
    #include <limits.h>

    int main()
    {

    FILE *fin=fopen("./file.pcap","rb");

    char line[LINE_MAX];

    FILE *fout=fopen("out.txt","w");

    while(fread(line,sizeof(line),1,fin)){
        fwrite(&line,sizeof(line),1,fout);
    }

    fclose(fin);
    fclose(fout);

    }

最初のファイルは約 51236 で、out.txt は 51200 です。

4

3 に答える 3

5

Fread は、読み取った「要素」の数を返します。要素の長さはバイトであると言ったLINE_MAXので、ファイルの最後に到達すると、完全な要素がないため、fread()0 が返され、出力が切り捨てられます。

「LINE_MAXバイトの1ブロック」ではなく「バイト数」を読み取るように反転してみてください。

size_t numBlocks;
while((numBlocks = fread(line, 1, sizeof(line), fin)) > 0) {
    fwrite(line, 1, numBlocks, fout);
}
于 2012-10-30T06:31:00.830 に答える
2

サイズのブロックを求めているため、ファイル サイズがその値の正確な倍数でLINE-MAXない場合、最終的なブロックは取得されません。読み取った完全なブロックの数を返します。次のようなものを使用する方が良いでしょう:fread

size_t sz;
while ((sz = fread (line, 1, sizeof (line), fin)) > 0) {
    fwrite (line, sz, 1, fout);
}

これにより、入力ファイルから任意の量 (最大 ) のデータが読み取らLINE_MAXれ、そのサイズのブロックが出力ファイルに書き込まれます。これは、 size の 1 ブロックを言う代わりに、1 バイトごとにブロックLINE_MAXを指定するためです。LINE_MAXそうすればLINE_MAX、ファイルに文字が残っていない場合、freadできるだけ多くの文字が表示されます。

ファイルの終わりはfreadゼロを返し、それ以外の値はデータが正常に読み取られたことを意味します。

余談ですが、 からの戻り値も確認する必要がありますfwrite。その引数を交換する必要はありませんが、戻り値が確実であることを確認する必要があります1または引数を交換するsz場合)。そうしないと、データがすべて書き込まれるとは限りません。

言い換えると:

size_t sz;
while ((sz = fread (line, 1, sizeof (line), fin)) > 0) {
    if (fwrite (line, sz, 1, fout) != 1) {
        // Handle error.
    }
}
于 2012-10-30T06:31:37.980 に答える
1

あなたは近づいていますが、入力ファイルの最後にある部分的なバッファを取得するfread()と戻ります。0その場合を処理するコードを追加する必要があります。そうしないと、それらのバイトの書き込みをスキップします。

&あなたの呼び出しfwrite()も不要ですが、それはあなたの問題とは関係ありません。

于 2012-10-30T06:28:19.113 に答える