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

C++ ifstream从二进制文件读取的数据与预期的不同,c++,C++,我在二进制文件中写入和读取字节数据时遇到问题。 我正在写一个char*的数据,它的数字形式如下: 32 16 19 23 23 84 23 16 19 23 23 84 0 0 0 0 0 83 8 6 1 22 21 20 0 66 120 但当我试图从文件中读取它们时,我得到了以下结果: 零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零 即使字节数相同,值也完全不同 以下是

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

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

但当我试图从文件中读取它们时,我得到了以下结果:

零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零

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

以下是我的职能:

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;
} 
void writeCipherTextToFile(标准::字符串文件名,字节\密码\文本密文){
流文件的std::of(文件名,std::ios::binary);
if(file.is_open()){
file.write(cipherText.byteArray,cipherText.count);
file.close();
}否则{

std::cout从您使用的
密文中。byteArray
它似乎是一个
字符*


cipherText.byteArray=memeblock;
使其指向与
memeblock
相同的地址。然后删除该缓冲区时,
byteArray
指针不再指向任何位置(悬空指针)

从该指针读取是未定义的行为,并且会得到不可预知的结果


您不应该执行删除操作(或
delete[]
实际上)在使用完
byteArray
之前,48和32是“0”和空格的十进制表示形式。这可能是导致意外行为的线索。
cipherText.byteArray=memeblock;
-是否在此处存储临时数据?发布MCVE。是的,memblock是临时的。奇怪的数据来自它。
delete memeblock;
未定义的行为,您需要使用
delete[]
。不幸的是,正如我在注释中所写,在删除之前,数据转储在memblock上完成。