-3

次の C++ コードに示すようにfwrite、MFC アプリケーションでコンテンツを印刷するために使用しています。lBuffer

PvBuffer *lBuffer = NULL;

// Retrieve next buffer     
PvResult lResult = lStream.RetrieveBuffer(&lBuffer, &lOperationResult, 1000);
if (lResult.IsOK())
{
    FILE *fp = fopen("C:\\Users\\acm45\\Desktop\\abuffer.bin", "wb");
    fwrite(lBuffer, 1, 10075968, fp);
    fclose(fp);
}

IResult成功を返しても、ファイル abuffer.bin の内容が常に空である理由は何ですか?
プログラムを実行すると常にファイルが作成されますが、ファイルは空で、サイズは 0KB です。

更新:
デバッグするには、これを行いました:

FILE *fp = fopen("C:\\Users\\acm45\\Desktop\\abuffer.bin", "wb");
if (fp) {
    fwrite(lBuffer, 1,10075968, fp);
    fclose(fp);
} else {
    printf("error opening file");
}

出力は「ファイルを開くエラー」を出力しませんでしたが、それでもファイルは空です。私は今何をしますか?

4

3 に答える 3

1

私はあなたがそこでいくつかの未定義の振る舞いをしていると思います。

fwriteのマニュアルページには次のように書かれています。

size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);

関数fwrite()は、各サイズがバイト長のデータのnmemb要素を、streamが指すストリームに書き込み、ptrで指定された場所から取得します。

しかし、あなたの電話

lStream.RetrieveBuffer( &lBuffer, &lOperationResult, 1000 );

それぞれ1バイトの長さの10075968要素がないことを推測させてください。

また:あなたのバッファはPOD要素のコレクションですか?そうでない場合は、それが未定義動作のもう1つの理由です。fwritePODタイプ専用です。

一般的には、C++ストリームを使用することをお勧めします。


fwriteを説明するための補遺

size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);

ここで、は単一要素sizeのサイズを意味します。

nmembそのような要素の数です。例えば:

...
struct Foobar {
    int frob;
};

int main () {
    ...
    Foobar thingies[5];
    fwrite (thingies, sizeof(Foobar), 5, some_file);
}

より一般的なアプローチは次のとおりです。

    Foobar thingies[5];
    const size_t nm = sizeof(thingies) / sizeof(Foobar);
    fwrite (thingies, sizeof(Foobar), nm, some_file);

これは、「配列のサイズを単一の要素のサイズで割ったもので、その配列の要素の数に等しい」と読みます。

ただし、これは配列に対してのみ機能し、ポインターに対しては機能しないことに注意してください。

    Foobar *thingies = new Foobar[5];
    const size_t nm = sizeof(thingies) / sizeof(Foobar);
    fwrite (thingies, sizeof(Foobar), nm, some_file);
    // THIS IS WRONG. sizeof(thingies) now equals to the
    // size of a pointer!
于 2012-07-03T11:58:07.723 に答える
-1

これを試してみてください:

FILE *fp = fopen("C:\\Users\\acm45\\Desktop\\abuffer.bin", "wb");
if (fp) {
    fwrite(lBuffer, 1, 10075968, fp);
    fclose(fp);
} else {
    perror("fopen");
}
于 2012-07-03T11:48:42.907 に答える
-1

バッファを正しく取得しているかどうかを確認してください。そのクラスで使用可能な場合は関数を使用して、バッファーのサイズを取得し、その定数の代わりに渡します。

于 2012-07-03T12:14:47.117 に答える