【问题标题】:write an object to a file using pointer in c++使用 C++ 中的指针将对象写入文件
【发布时间】:2020-02-15 18:21:42
【问题描述】:

我有这个对象 ob,我正在使用指向该对象的指针将其写入文件。但它似乎不起作用。

class A
{
public:
    int Arr[10];
    A();
};
A::A()
{
    for(int i=0;i<10;i++)
        Arr[i] = 0;
}
A obj;
int main(int argc, char *argv[])
{
    A *ptr = &obj, temp;
    obj.Arr[0] = 1;

    fstream fp("temp", ios::in|ios::binary|ios::out);
    fp.write((char *)ptr, sizeof(*ptr));
    fp.close();

    fp.open("temp", ios::in|ios::binary|ios::out);
    fp.read((char *)&temp, sizeof(temp));
    for(int i=0;i<10;i++)
        cout<<temp.Arr[i]<<" ";
    fp.close();
    return 0;
}

输出:

0 0 0 0 0 0 0 0 0 0

预期输出:

1 0 0 0 0 0 0 0 0 0

如何使用指针直接写入对象。还有有什么办法可以直接读取指针本身的内容吗?

【问题讨论】:

  • 学习一些基本的调试技能永远不会太早。首先,检查文件的二进制内容。这至少会告诉您问题是从文件写入还是从文件读取。一旦你知道问题出在哪里,你就有了调查的起点。 P.S.:你的 C++ 书对ios::trunc 标志有什么看法?

标签: c++ class object pointers file-handling


【解决方案1】:

您打开文件以读取 (std::ios::in) 两次。当你打开文件读取时,它必须存在,否则打开会失败,也就是说你第一次打开没有成功,所以文件没有被创建。

由于文件丢失,您的第二次打开也会失败。

因此,请始终检查打开文件是否确实成功并使用正确的打开模式:

#include <fstream>
#include <iostream>
class A {
public:
    int Arr[10]{};

    void print() const {
        for(int val : Arr) std::cout << val << ' ';
        std::cout << '\n';
    }
};

int main() {
    A obj;
    A temp;
    obj.Arr[0] = 1;

    // open file for writing and check that opening succeeded
    if(std::ofstream fp("temp", std::ios::binary); fp) {
        obj.print();
        fp.write(reinterpret_cast<const char*>(&obj), sizeof(obj));
    }

    // open the file for reading and check that opening succeeded
    if(std::ifstream fp("temp", std::ios::binary); fp) {
        fp.read(reinterpret_cast<char*>(&temp), sizeof(temp));
        temp.print();
    }
}

【讨论】:

  • 问题出在我第一次打开文件进行写入的那一行。由于文件不存在,我们不应该通过ios::in 标志
  • @PulkitBhatnagar 我应该更清楚。您打开文件进行两次读取和写入。这就是我所说的“第一次打开文件以进行阅读时”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-09
  • 1970-01-01
  • 2023-03-11
  • 2013-03-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多