C++ 读取二进制文件时出现问题(ascii和二进制混合)
我读取二进制文件的代码是:C++ 读取二进制文件时出现问题(ascii和二进制混合),c++,file-io,C++,File Io,我读取二进制文件的代码是: dataFile.open(fileName.c_str()); ifstream binData("Trafficlog_Data.txt", ios::in | ios::binary); //binary data file if(!binData) { cout << "Cannot open file.\n"; return -1; } char *memblock;int nBytes =12; memblock = new
dataFile.open(fileName.c_str());
ifstream binData("Trafficlog_Data.txt", ios::in | ios::binary); //binary data file
if(!binData) {
cout << "Cannot open file.\n";
return -1;
}
char *memblock;int nBytes =12;
memblock = new char [nBytes+1];
binData.read(memblock,nBytes);
memblock[nBytes+1]='\0';
std::string message;message.assign(memblock,nBytes);
printf("%s\n",message.c_str());
dataFile.open(fileName.c_str());
ifstream binData(“Trafficlog_Data.txt”,ios::in | ios::binary)//二进制数据文件
如果(!binData){
不能改变:
memblock[nBytes+1]='\0';
致:
假设您将六个字节读入memblock
,这些字节进入0
到5
的位置,包括:
0 1 2 3 4 5 6 7
+---+---+---+---+---+----+---+---+
| H | E | L | L | O | \n | ? | ? |
+---+---+---+---+---+----+---+---+
(?
区域仍然包含以前存在的垃圾)
然后,您需要将空终止符放在位置6,而不是代码中的位置7
通过将空终止符放在“右侧”太远,您就包括了第一个?
位置,该位置可以容纳任何内容
这就是导致您的特定问题的原因。您还有一个问题,即您没有分配空间来保存正在读取的数据。您只有一个char*
,但您没有实际初始化它以指向可用内存。这几乎肯定会导致问题
最简单的解决方案可能是将其定义为:
char memblock[nBytes+1];
虽然我看到你已经在你的问题中解决了这个问题,所以它没有什么影响。实际问题(将空字节放在错误的位置)在上面已经讨论过了。你只需执行memblock[nBytes]='\0';
索引从0开始,因此如果nBytes
为0,则在第一个位置写入,如果nBytes
为1,则在第二个位置写入,依此类推。通过执行nBytes+1
操作,实际上跳到了一个位置之前,并在字符串末尾留下了一个垃圾字节。您没有为membl分配内存奥克:
char *memblock = new char[nBytes+1];
呵呵,1,完全错过了一个。我做了,但是没有写在这里。SRYY你还需要考虑在你的代码之前点击EOF的情况。。在这种情况下,您必须计算出实际读取了多少字节。@honeybadger:这并不重要。无论您在读取什么,您都必须将空终止符放在正确的位置。但是,我调整了答案,使其更接近您想要的场景。我已将“\0”放在正确的位置。就在我读取了12个字节后,即“RFB 003.003\n”并在其后加上“\0”,但实际上从文件中读取的是“RFB 003.003=”问题在于ascii和二进制数据i的混合guess@honeybadger,您需要重新读取答案。您读取了12个字节(偏移量0到11)然后你把空值放在偏移量nBytes+1
-那是13,而不是应该的12。在你开始之前偏移量12的垃圾仍然存在。
char *memblock = new char[nBytes+1];