返回信息流代码如下:
bool WirteToFileB(const char* fileName, vector<float> &ZPArray, vector<float> &ISArray)
{
ofstream outputFile(fileName);
if (!outputFile.is_open())
return false;
for (int i = 0; i < 37; i++)
{
outputFile.write((char *)&ZPArray[i], sizeof(float));
outputFile.write((char *)&ISArray[i], sizeof(float));
}
/*
for (int i = 0; i < ZPArray.size(); i++)
{
//outputFile.write((char *)&ZPArray[i], 4);
//outputFile.write((char *)&ISArray[i], 4);
}
*/
outputFile.close();
return true;
}
就是把两个vector里的数据用二进制方式写入文件中。一开始使用注释中的代码,发现文件最后总是多出了一个字节。经过测试发现,当i大于36时,总是会多出一个字节,像下边:
右侧写入36对数据时,没有问题;左侧写入37对数据时,末尾会莫名其妙地多出一个字节
观察发现应该是 0x00000121 这个位置多出来一个 0x00 这到底是怎么做到的?!跪求C++大神解惑
这是一条镜像帖。来源:北邮人论坛 / cpp / #84485同步于 2014/11/29
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
[问题]ofstream的write方法总是多出一个字节
liuaner022
2014/11/29镜像同步4 回复
订阅后,新回复会通过你的通知中心匿名送达。
4 条回复
楼主应该把输入数据贴出来的。
多一个字节的原因我不认为是lz说的那个0x00的事,注意到倒数第二个数字是 0x64, 0x00, 0x0d, 0x0a, 0x43,这里面有一个回车换行符,加上lz用的win的开发环境,在加上楼主打开二进制文件时没有加"b"标志,所以应该是这个数字本来是0x64, 0x00, 0x0a, 0x43,被C++库把LF替换成了CRLF,从而多了一个字节。
所以,建议楼主改一下代码吧 ==> ofstream outputFile(fileName, ios::binary);
【 在 liuaner022 的大作中提到: 】
: 代码如下:
: bool WirteToFileB(const char* fileName, vector<float> &ZPArray, vector<float> &ISArray)
: {
: ...................
多说一句,Linux下打开文件时文本模式和二进制模式没有区别,但对于Win来说,二进制模式是原样输出,而文本模式会把所有的单个换行符替换成回车换行符,这是因为Win的文件中回车包含两个字节CRLF,但在代码里只有一个字节LF('\n'),所以C++库不得不做些手脚
【 在 gaoweiwei 的大作中提到: 】
: 楼主应该把输入数据贴出来的。
: 多一个字节的原因我不认为是lz说的那个0x00的事,注意到倒数第二个数字是 0x64, 0x00, 0x0d, 0x0a, 0x43,这里面有一个回车换行符,加上lz用的win的开发环境,在加上楼主打开二进制文件时没有加"b"标志,所以应该是这个数字本来是0x64, 0x00, 0x0a, 0x43,被C++库把LF替换成了CRLF,从而多了一个字节。
: 所以,建议楼主改一下代码吧 ==> ofstream outputFile(fileName, ios::binary);
不可能呀~~我 write 参数里的输出字节数是4字节,不管这个数是多少,都应该只写入4字节才对呀而且我根本没有写入换行符之类的东西。
不过忘了 ios::binary 确实是个失误,等我去实验室了再测试一下
【 在 gaoweiwei 的大作中提到: 】
: 楼主应该把输入数据贴出来的。
: 多一个字节的原因我不认为是lz说的那个0x00的事,注意到倒数第二个数字是 0x64, 0x00, 0x0d, 0x0a, 0x43,这里面有一个回车换行符,加上lz用的win的开发环境,在加上楼主打开二进制文件时没有加"b"标志,所以应该是这个数字本来是0x64, 0x00, 0x0a, 0x43,被C++库把LF替换成了CRLF,从而多了一个字节。
: 所以,建议楼主改一下代码吧 ==> ofstream outputFile(fileName, ios::binary);
高!实在是高!确实是你说的那样~~想不到还有如此隐藏的BUG,学习了~~
【 在 gaoweiwei 的大作中提到: 】
: 多说一句,Linux下打开文件时文本模式和二进制模式没有区别,但对于Win来说,二进制模式是原样输出,而文本模式会把所有的单个换行符替换成回车换行符,这是因为Win的文件中回车包含两个字节CRLF,但在代码里只有一个字节LF('\n'),所以C++库不得不做些手脚