записать объект в файл, используя указатель в C ++ - PullRequest
0 голосов
/ 15 февраля 2020

У меня есть объект 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

Как написать объект напрямую, используя указатель. Также есть ли способ непосредственно прочитать содержимое самого указателя?

1 Ответ

1 голос
/ 15 февраля 2020

Вы открываете файл для чтения (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();
    }
}
...