1

Cを使用していて、binaryFileから読み取りたい。

私はそれが次のように文字列を含んでいることを知っています:文字列の長さ、文字列自体、文字列の長さ、文字列自体など...

文字列Strがバイナリファイルに現れる回数を数えたいです。

だから私はこのようなことをしたい:

int N;
while (!feof(file)){
    if (fread(&N, sizeof(int), 1, file)==1)
        ...

次に、文字列自体を取得する必要があります。私はそれが長さであることを知っています。'for'ループを実行し、fgetc char by charを取得する必要がありますか?テキストファイルではないため、fscanfの使用が許可されていないことはわかっていますが、fgetcを使用できますか?そして、私は自分の弦に期待しているものを手に入れるでしょうか?(長さのサイズでchar *の動的割り当てを使用し、strcpyを使用して現在の文字列に追加するには?)

4

2 に答える 2

5

malloc次にfread、そのバッファにメモリを割り当てることができます。

char *str;

/* ... */
if (fread(&N, sizeof(int), 1, file)==1)
{
    /* check that N > 0 */
    str = malloc(N+1);
    if (fread(str, sizeof(char), N, file) == N)
    {
        str[N] = '\0'; /* terminate str */
        printf("Read %d chars: %s\n", N, str);
    }

    free(str);
}
于 2012-07-19T15:37:56.670 に答える
4

おそらくループする必要があります:

while (fread(&N, sizeof(int), 1, file) == 1)
{
    // Check N for sanity
    char *buffer = malloc(N+1);
    // Check malloc succeeded
    if (fread(buffer, N, 1, file) != 1)
        ...process error...
    buffer[N] = '\0';  // Null terminate for sanity's sake
    ...store buffer (the pointer) for later processing so you aren't leaking...
    ...or free it if you won't need it later...
}

getc()orfgetc()をループで使用できます。それはうまくいくでしょう。ただし、直接fread()ははるかに単純です (そして、ループで使用するかのようにコーディングされます)。getc()

Nやみくもに使用する前に、いくつかの健全性チェックを行うことをお勧めしますmalloc()。特に、負の値は多くの不幸につながる可能性があります。

記述されているファイル形式は、マシンの 1 つのクラス (ビッグ エンディアンまたはリトル エンディアン) に関連付けられており、固定サイズint(おそらく 32 ビット) です。より移植性の高いデータを作成するのは少し手間がかかりますが、非常に実行可能ですが、おそらくまだあなたには関係ありません。

を使用feof()してループを続行するかどうかをテストする正しい方法はほとんどありません。feof()実際、コードで使用する必要はあまりありません。これが使用されるのは、I/O 操作が「失敗した」ためであり、「エラーではなく、単なる EOF」と「デバイスで何らかのエラーが発生した」を区別する必要があります。

于 2012-07-19T15:38:57.543 に答える