c++ - 使用 reinterpret_cast 读取数据失败在 C++ 中
问题描述
#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=2
and y=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 操作都可能由于各种原因随时失败,因此请检查其状态!
推荐阅读
- sql - 用于 Laravel 的 Firebase 与 Google Cloud SQL
- python - 在python中读取csv文件
- mysql - 关于连接表的 SQL
- eclipse - 如何在 Eclipse(氧气版本)中以编程方式关闭索引器?
- mongodb - 如何为 MongoDb 调用注入 spring aop 建议?
- javascript - 解码 gtfs-r 数据时出现“非法组结束指示符...(不是组)”
- smarty - 在产品列表中显示制造商名称 (Prestashop 1.7)
- python - 熊猫将值从一行复制到另一行
- sql-server - 将参数传递给 OPENQUERY
- php - PHP:找不到类 tcpdf 错误的路径