1

float値を持つ大きなテキストファイルのサイズをバイナリの.datファイルに縮小したかったので、(c ++で)使用しました。

// the text stream
std::ifstream fin(sourceFile);
// the binary output stream
std::ofstream out(destinationFile, std::ios::binary);

float val;
while(!fin.eof())
{
    fin >> val;     
    out.write((char *)&val,sizeof(float));
}
fin.close();
out.close();

次に、すべてのfloat値を、作成されたバイナリファイルからfloat値の配列に読み込みたいと思いました。しかし、このファイルから読み込もうとすると、コードの最後の行(読み取りプロセス)で例外が発生します。

// test read
std::ifstream fstream(destinationFile, std::ios::binary);

__int64 fileSize = 0;
struct __stat64 fileStat;  
if(0 == _tstat64(destinationFile, &fileStat))
{
    fileSize = fileStat.st_size;
}

//get the number of float tokens in the file
size_t tokensCount = fileSize / sizeof(float);
float* pBuff = new float[tokensCount];
fstream.read((char*)&pBuff, tokensCount * sizeof(float));

私は何が間違っているのですか?

4

3 に答える 3

5
float* pBuff = new float[tokensCount];
fstream.read((char*)&pBuff, tokensCount * sizeof(float));

pBuff変数が指すバッファーではなく、変数を読み込んでいます。もしかして:

fstream.read((char*)pBuff, tokensCount * sizeof(float));
于 2010-02-09T10:39:33.563 に答える
5

これに注意してください:

while(!fin.eof())
{
    fin >> val;     
    out.write((char *)&val,sizeof(float));
}

これはファイルを読み取る正しい方法ではありません。最後にガベージ値を読み取ります。この関数を使用することはほとんどありませんeof()。また、ファイルの読み取りが機能したことを常に確認する必要があります。正しいコードは次のとおりです。

while( fin >> val )
{
    out.write((char *)&val,sizeof(float));
}
于 2010-02-09T10:49:28.813 に答える
4

マグナスの答えは正しく、あなたの問題を解決するはずです。教祖が言うように、邪悪なCスタイルのキャストを使用していなければ、そもそも問題はなかっただろうと付け加えておきます。最後の行をこれに変更した場合:

fstream.read(static_cast<char*>(&pBuff), tokensCount * sizeof(float));

その場合、プログラムはコンパイルに失敗し、エラーメッセージが解決策につながります。

編集: pBuffがchar以外のタイプへのポインターである場合、私のソリューションは機能しません。したがって、OPの場合は役に立ちません。

于 2010-02-09T10:47:43.840 に答える