我想将带浮点值的大文本文件的大小缩小为二进制.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();
然后,我想将显式创建的二进制文件中的所有浮点值读入浮点值数组。 但是当我尝试从这个文件中读取时,我在最后一行代码(读取过程)中得到一个异常:
// 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));
我做错了什么?
答案 0 :(得分:5)
float* pBuff = new float[tokensCount];
fstream.read((char*)&pBuff, tokensCount * sizeof(float));
您正在读取pBuff
变量,而不是它指向的缓冲区。你的意思是:
fstream.read((char*)pBuff, tokensCount * sizeof(float));
答案 1 :(得分:5)
请注意:
while(!fin.eof())
{
fin >> val;
out.write((char *)&val,sizeof(float));
}
不是读取文件的正确方法 - 它会在最后读取垃圾值。您几乎不应该使用eof()
函数,并且您应该始终检查文件读取是否有效。正确的代码是:
while( fin >> val )
{
out.write((char *)&val,sizeof(float));
}
答案 2 :(得分:4)
马格努斯的回答是正确的,应该可以解决你的问题。我只会补充说,如果你像大师那样说并且没有使用邪恶的C风格的演员,那么你首先不会遇到问题。如果您将最后一行更改为:
fstream.read(static_cast<char*>(&pBuff), tokensCount * sizeof(float));
然后您的程序将无法编译,错误消息将导致您找到解决方案。
编辑:如果pBuff是指向除char之外的任何类型的指针,则我的解决方案不起作用。所以在OP的情况下没用。