我读取二进制文件的代码是:
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());
现在我已经给出了一个包含二进制和ascii数据的输入文件
RFB 003.003
RFB 003.003
- 一些二进制数据 -
当我读取前12个字节的文件“RFB 003.003 \ n”时,它会打印“RFB 003.003 =”。任何人都可以告诉我哪里弄错了。 promblem不是'\ 0'。问题是它没有读“RFB 003.003 \ n”。是因为这个文件是二进制和ascii数据的混合
答案 0 :(得分:2)
您没有为memblock分配内存:
char *memblock = new char[nBytes+1];
答案 1 :(得分:1)
变化:
memblock[nBytes+1]='\0';
为:
memblock[nBytes]='\0';
假设你以六个字节读到memblock
,进入0
到5
的位置:
0 1 2 3 4 5 6 7
+---+---+---+---+---+----+---+---+
| H | E | L | L | O | \n | ? | ? |
+---+---+---+---+---+----+---+---+
(?
区域仍然包含之前的垃圾。)
然后,您需要将null终止符放在位置6而不是位置7,就像您的代码一样。
通过将空终止符放置到“右”的位置太远,您将包含第一个?
位置,这可能会保留任何内容。
这就是造成你特定问题的原因。您还遇到一个问题,即您没有分配空间来保存您正在读取的数据。您只有一个char *
,但实际上并没有将其初始化为指向可用内存。这几乎肯定会导致问题。
可能最简单的解决方案是将其定义为:
char memblock[nBytes+1];
虽然我现在看到你已经在你的问题中解决了这个问题,但这并不重要。 实际问题(将空字节放在错误的位置)将在上面介绍。
答案 2 :(得分:0)
你是一个接一个:只做memblock[nBytes]='\0';
索引从0开始,所以如果nBytes
为0你就是在第一个位置写,如果nBytes
是1你在第二个位置写作,依此类推。通过执行nBytes + 1
,您实际上跳过一个位置并在字符串末尾留下一个垃圾字节。