Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 读取二进制文件时出现问题(ascii和二进制混合)_C++_File Io - Fatal编程技术网

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];