ifstream从二进制文件中读取的数据不同于预期

时间:2015-10-31 23:28:27

标签: c++

我在向二进制文件写入和从二进制文件读取字节数据时遇到问题。 我正在编写char*的数据,其数字形式如下:

  

32 16 19 23 23 84 23 16 19 23 23 84 0 0 0 0 0 0 83 8 6 1 22 21 20 0 66   120

但是当我尝试从文件中读取它时,我得到了这个:

  

0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 -1 -1 -1 -1 0 0 0 0 48 0 0 32

即使字节数相同,该值也完全不同。

这些是我的功能:

void writeCipherTextToFile(std::string fileName, BYTE_CIPHER_TEXT cipherText) {

 std::ofstream file(fileName, std::ios::binary);

 if (file.is_open()) {
      file.write(cipherText.byteArray, cipherText.count);
      file.close();
 } else {
      std::cout << "Error: Can't write file named " << fileName << std::endl;
      exit(1);
 }
}

BYTE_CIPHER_TEXT readCipherTextFromFile(std::string fileName) {

 std::ifstream file(fileName, ios::in|ios::binary|ios::ate);
 std::streampos size;
 BYTE_CIPHER_TEXT cipherText;
 char* memeblock;

 if (file.is_open()) {


      size = file.tellg();
      file.seekg(0, std::ios::beg);

      cout << "size: " << size<<endl;;

      memeblock = new char[size];         
      file.read(memeblock, size);

      file.close();

      cipherText.byteArray = memeblock;
      cipherText.count = size;

      delete memeblock;
 } else {
      std::cout << "Error: Can't read file named " << fileName << std::endl;
      exit(1);
 }
 return cipherText;
} 

我发现了许多关于ifstream的奇怪行为的问题,但所有这些问题都与字符有关。我不想让他们的ASCII等价。我想将原始数据读取到char*,因此很多值可能被理解为特殊字符,但我不需要它们的含义。

1 个答案:

答案 0 :(得分:0)

从您使用cipherText.byteArray开始,它似乎是char*

cipherText.byteArray = memeblock;使其指向与memeblock相同的地址。当你删除那个缓冲区时,byteArray指针不再指向任何地方(悬空指针)。

从该指针读取未定义的行为,会得到不可预测的结果。

在完成delete[]之后,您不应该执行删除(或实际为byteArray