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

ifstream reads different data from binary file than expected

本文关键字:数据 二进制文件 读取 ifstream      更新时间:2023-10-16

我在二进制文件中写入和读取字节数据时遇到问题。我正在写一个char*的数据,它看起来像这样的数字形式:

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

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

0 0 0 0

即使字节数相同,但值却完全不同。

这些是我的功能:

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*,这样很多值可能会被理解为特殊字符,但我不需要它们的含义,只需要它们的值。

从您对cipherText.byteArray的使用来看,它似乎是一个char*

CCD_ 6使其指向与CCD_ 7相同的地址。当您删除该缓冲区时,byteArray指针不再指向任何位置(悬空指针)。

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

在使用完byteArray之前,不应该执行删除操作(实际上是delete[])。