【问题标题】:Failed to read data using reinterpret_cast<char*> in C++在 C++ 中使用 reinterpret_cast<char*> 读取数据失败
【发布时间】:2019-05-28 20:23:51
【问题描述】:
#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 两次,而不是读入xy
  • 是的,这是一个错字。让我现在编辑它。

标签: c++ file c++11 fstream reinterpret-cast


【解决方案1】:

正如在 cmets 中指出的那样,您至少有两个错误:

第一个问题在于您的读取:您的读取都使用x 的地址和y 的大小,我敢肯定这只是一个错字。

其次,在再次读取相同的数据之前,您必须 close() 为写入而打开的文件(或至少,flush 您的写入 (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 操作都可能因各种原因随时失败,因此请检查其状态!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-25
    • 2012-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多