C++ c++;

C++ c++;,c++,binaryfiles,C++,Binaryfiles,我想将带有浮点值的大型文本文件缩小为二进制.dat文件,因此(在c++中)使用: 然后,我想将以前创建的二进制文件中的所有浮点值读取到一个浮点值数组中。 但当我尝试读取此文件时,在最后一行代码(读取过程)处出现异常: 我做错了什么 float* pBuff = new float[tokensCount]; fstream.read((char*)&pBuff, tokensCount * sizeof(float)); 您正在读取pBuff变量,而不是它所指向的缓冲区。你的意思是:

我想将带有浮点值的大型文本文件缩小为二进制.dat文件,因此(在c++中)使用:

然后,我想将以前创建的二进制文件中的所有浮点值读取到一个浮点值数组中。 但当我尝试读取此文件时,在最后一行代码(读取过程)处出现异常:

我做错了什么

float* pBuff = new float[tokensCount];
fstream.read((char*)&pBuff, tokensCount * sizeof(float));
您正在读取
pBuff
变量,而不是它所指向的缓冲区。你的意思是:

fstream.read((char*)pBuff, tokensCount * sizeof(float));
您正在读取
pBuff
变量,而不是它所指向的缓冲区。你的意思是:

fstream.read((char*)pBuff, tokensCount * sizeof(float));

马格纳斯的回答是正确的,应该能解决你的问题。我只想补充一点,如果你按照大师所说的去做,而不是使用邪恶的C型演员,那么你一开始就不会有问题。如果将最后一行更改为:

fstream.read(static_cast<char*>(&pBuff), tokensCount * sizeof(float));
fstream.read(static_cast(&pBuff),tokenscont*sizeof(float));
那么您的程序将无法编译,错误消息将引导您找到解决方案


编辑:如果pBuff是指向除char以外的任何类型的指针,则我的解决方案不起作用。因此,这在OP的情况下是没有用的。

马格纳斯的回答是正确的,应该可以解决您的问题。我只想补充一点,如果你按照大师所说的去做,而不是使用邪恶的C型演员,那么你一开始就不会有问题。如果将最后一行更改为:

fstream.read(static_cast<char*>(&pBuff), tokensCount * sizeof(float));
fstream.read(static_cast(&pBuff),tokenscont*sizeof(float));
那么您的程序将无法编译,错误消息将引导您找到解决方案

编辑:如果pBuff是指向除char以外的任何类型的指针,则我的解决方案不起作用。因此,在OP的情况下,它没有任何用处。

请注意:

while(!fin.eof())
{
    fin >> val;     
    out.write((char *)&val,sizeof(float));
}
读取文件的方法不正确——它将在末尾读取垃圾值。您几乎不应该使用
eof()
函数,并且应该始终检查文件读取是否有效。正确的代码是:

while( fin >> val )
{
    out.write((char *)&val,sizeof(float));
}
请注意:

while(!fin.eof())
{
    fin >> val;     
    out.write((char *)&val,sizeof(float));
}
不是读取文件的正确方法-它将在最后读取一个垃圾值。您几乎不应该使用
eof()
函数,并且应该始终检查文件读取是否有效。正确的代码是:

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

你是对的,但是如果我写fstream.read(static_cast(pBuff),tokenscont*sizeof(float));它仍然无法编译…抱歉,我只使用char*pBuff测试了它,但是当pBuff是任何其他类型时它都不起作用。有什么办法可以让我把从这些投票中获得的代表退回来吗?别担心。无论如何,使用C++风格的强制转换是一个很好的建议,尽管这里可能更适合
reinterpret\u cast
。或者,您可以编辑/修复您的答案,并继续获得更多的赞成票!:)你是对的,但是如果我写fstream.read(static_cast(pBuff),tokenscont*sizeof(float));它仍然无法编译…抱歉,我只使用char*pBuff测试了它,但是当pBuff是任何其他类型时它都不起作用。有什么办法可以让我把从这些投票中获得的代表退回来吗?别担心。无论如何,使用C++风格的强制转换是一个很好的建议,尽管这里可能更适合
reinterpret\u cast
。或者,您可以编辑/修复您的答案,并继续获得更多的赞成票!:)