读取二进制文件的问题(ascii和二进制的混合)

时间:2011-03-30 12:36:59

标签: 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 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数据的混合

3 个答案:

答案 0 :(得分:2)

您没有为memblock分配内存:

char *memblock = new char[nBytes+1];

答案 1 :(得分:1)

变化:

memblock[nBytes+1]='\0';

为:

memblock[nBytes]='\0';

假设你以六个字节读到memblock,进入05的位置:

  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,您实际上跳过一个位置并在字符串末尾留下一个垃圾字节。