2

以前にそこに書き込んだデータのfstreamを使用して、バイナリファイルから読み取ろうとしています。

問題は、関数の最後に到達した後、件名のメッセージが表示されることです

コードは次のとおりです。

ifstream in("contrib.bin", ios::in | ios::binary );

char *nume, dim;
in.read((char*)&dim, sizeof(int));
nume = new char[dim + 1];
in.read(nume, dim);
nume[dim] = '\0';
double imp;
in.read((char*)&imp, sizeof(double));

delete [] nume;

今、私は宿題をしてこの問題を探しましたが、それに直面した他の人々は配列を持っていましたが、私の変数は単純な文字です。

誰かが私を正しい方向に向けることができますか?

4

3 に答える 3

13

コード

char dim;
in.read((char*)&dim, sizeof(int));

sizeof(int)1バイトの文字を定義し、バイト(1より大きい可能性が高い)をその文字に読み込みます。これは無効であり、スタックが破損する可能性があります。

sizeof(int)バイトを読み取る必要がある場合は、として宣言dimintます。sizeof(dim)それ以外の場合は、読み取るバイト数を1に変更します。ストレージを提供したのと同じ数のバイトのみを読み取るように使用した場合も最適です。

in.read((char*)&dim, sizeof(dim));
于 2013-01-11T16:28:27.620 に答える
7

in.read((char*)&dim, sizeof(int));正しくありません。どちらか一方dimだけが保持sizeof(char)されますが、読み込もうとしsizeof(int)ています。

この後、すべての手袋が外れます。

于 2013-01-11T16:28:12.453 に答える
2

さて、あなたは文字を定義してから、intのサイズで読みます。それが最初の問題になります

char *nume, dim;
in.read((char*)&dim, sizeof(char));
于 2013-01-11T16:29:10.997 に答える