无法在C ++

时间:2019-01-02 06:23:14

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

#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。我在哪里做错了?

1 个答案:

答案 0 :(得分:0)

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

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

第二,您必须close()打开要写入的文件(或至少 flush 您写入的文件(sync()),然后才能再次读取相同的数据,但是需要大量的谨慎和特殊规则。)无论如何,您都需要关闭文件,方法是让句柄(在这种情况下为file)超出范围并调用其析构函数,或者调用{{1 }}自己(写完之后。)

为防止出现此问题,通常您必须每次进行I / O时都要检查错误 。为此,您可以像使用布尔变量一样使用文件句柄的名称,例如:

file.close()

我想知道实际发生的情况,类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,该转换返回上一次操作是否成功(或流是否可读/也有许多为C ++流(输入和输出)定义的成员函数,可以帮助您检查错误,流的结束等,例如boolbad()good()fail()等。

再次,请记住,由于各种原因,任何I / O操作都可能随时失败,因此请检查其状态!