无法在C++中使用reinterpret_cast<char*>读取数据

Failed to read data using reinterpret_cast<char*> in C++

本文关键字:char lt 数据 读取 gt cast C++ reinterpret      更新时间:2023-10-16
#include <iostream>
#include <vector>
#include <fstream>
using namespace std;
int main(){
// write file
string file_name = "random_fstream.dat";
ofstream file(file_name, ios_base::out | ios_base::binary);
if (!file) {return EXIT_FAILURE;}
int r = 2; 
int c = 3;
file.write(reinterpret_cast<char*>(&r),sizeof(r));
file.write(reinterpret_cast<char*>(&c),sizeof(c));
//------------------------------------------------
// read file
ifstream in(file_name, ios_base::in | ios_base::binary);
if (!in) {return EXIT_FAILURE;}
int x = 0;
int y = 0;
in.read(reinterpret_cast<char*>(&x),sizeof(x));
in.read(reinterpret_cast<char*>(&y),sizeof(y));
cout << x << y << endl;

return 0;
} 

我试着在C++中练习写和读文件。第一步是将int值2和3以二进制形式写入文件。第二步是从文件中读取这两个数字。

然后我得到x和y的值都等于0,但我希望收到x=2y=3。我哪里做错了?

正如评论中所指出的,您至少有两个错误:

第一个问题是你的阅读:你的阅读都使用了x的地址和y的大小,我相信这只是一个拼写错误。

其次,在再次读取相同的数据之前,您必须先close()打开的文件进行写入(或者至少,刷新您的写入(sync()),但这需要非常谨慎和特殊的规则。)无论如何,您需要关闭文件,要么让句柄(在本例中为file)超出范围并调用其析构函数,要么自己(在写入之后)调用file.close()

为了防止这个问题,您通常必须在每次执行任何I/O时检查错误。要做到这一点,您可以像使用布尔变量一样使用文件句柄的名称,例如:

in.read(reinterpret_cast<char*>(&x),sizeof(x));
if (!in)
cerr << "First read failed." << endl;
in.read(reinterpret_cast<char*>(&y),sizeof(y));
if (!in)
cout << "Second read failed." << endl;

我想知道实际发生了什么,类std::istream有一个到bool的显式转换,它返回最后一次操作是否成功(或者流是否处于可读/良好状态)。还有许多为C++流(包括输入和输出)定义的成员函数,可以帮助您检查错误、流的结尾等,例如bad()good()fail()eof()

同样,请记住,任何I/O操作都可能因各种原因在任何时候失败,因此请检查其状态!