Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Fatmarmelad
4 / 4 / 0
Регистрация: 20.02.2016
Сообщений: 889
1

Где находится файл при записи/чтении объекта и как его прочитать?

25.10.2018, 21:41. Просмотров 350. Ответов 4
Метки нет (Все метки)

Доброго всем времени суток!
Есть код записи объекта на диск (ниже). Насколько я понимаю, объект записывается в файл file.dat.
Как можно добраться до этого файла, чтобы прочитать записанные данные?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include<iostream>
#include<string>
#include<fstream>
using namespace std;
class ClassX
{
protected:
    int x1;
    string str;
public:
    ClassX() :x1(){}
 
    void g_in()
    {
        cin >> x1;
        cin >> str;
    }
    void g_out()
    {
        cout << x1 << endl;
        cout << str << endl;
    }
};
int main()
{
    ClassX sx;
    sx.g_in();
    ofstream ofs("file.dat", ios::binary);
    ofs.write(reinterpret_cast<char*>(&sx), sizeof(sx));
    return 0;
}
Я думал так, что, если создам новый проект (ниже) с функцией read(), объект можно будет прочитать. Но у меня это не получилось. Как можно прочитать записанный файл, создав отдельную программу? Или


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include<iostream>
#include<string>
#include<fstream>
using namespace std;
class ClassX
{
protected:
    int x1;
    string str;
public:
    ClassX() :x1(){}
 
    void g_in()
    {
        cin >> x1;
        cin >> str;
    }
    void g_out()
    {
        cout << x1 << endl;
        cout << str << endl;
    }
};
int main()
{
    ClassX sx;
    ifstream ifs("file.dat", ios::binary);
    ifs.read(reinterpret_cast<char*>(&sx), sizeof(sx));
    sx.g_out();
    return 0;
}
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.10.2018, 21:41
Ответы с готовыми решениями:

Абракадабра при записи в файл и при чтении из него кириллицы
#include &lt;iostream&gt; #include &lt;fstream&gt; using namespace std; int main() { ofstream...

Ошибка при записи или чтении в бинарный файл
Есть такие вот типы данных: struct Nomer { int n, tsena1Deni; string klass; int kMest,...

Прочитать Xml файл: исключение NullReferenceException при чтении
Всем привет! Нужно прочитать XML файл. Делаю так using System.IO; using System.Text; using...

При записи в файл и при чтении выводится не вся информация
не работает следующее, когда сохраняешь файл с данными, а потом загружаешь его то выводит не всю...

Не находится файл при десериализации объекта
Здравствуйте ! Подскажите пожалуйста, почему программа не может найти файл Demon.bin по пути ...

4
Martein
690 / 99 / 17
Регистрация: 22.06.2014
Сообщений: 209
25.10.2018, 21:55 2
Нельзя таким образом "сохранять объекты" на диск, так как по крайней мере тот же string не хранит строку внутри именно вашего объекта, строка хранится в динамически выделенной памяти где-то в куче, а в объекте внутри класса string всего лишь указатель на неё (это грубое такое описание), который после чтения из файла в другой программе будет уже просто не актуальный и будет указывать в место в памяти, в котором вашей строке взяться попросту неоткуда. Поэтому выходом из ситуации будет лишь сохранение конкретных значений каждого члена объекта в файл при помощи вывода этих данных через cout поочерёдно применяя его к каждому члену, тип которого поддерживает вывод через cout или через способ сериализации и десериализации данных. А reinterpret_cast -- это синтаксическая кувалда (как сказал Скотт Мейерс), от которой и вовсе стоит бежать как от огня, но знать о ней стоит.
0
Fatmarmelad
4 / 4 / 0
Регистрация: 20.02.2016
Сообщений: 889
25.10.2018, 22:30  [ТС] 3
Martein, а если string заменить на массив char , можно ли файл открыть в другой программе?
0
PeterVl
13 / 10 / 3
Регистрация: 25.10.2018
Сообщений: 101
Завершенные тесты: 1
25.10.2018, 22:33 4
Лучше использовать сериализацию объектов при записи в файл. Я делал так, когда писал на яве. Удобно и просто. То же самое и с десериализацией.
0
Martein
690 / 99 / 17
Регистрация: 22.06.2014
Сообщений: 209
25.10.2018, 23:09 5
Fatmarmelad, если класс состоит из встроенных типов C++, то для них можно использовать ввод/вывод с использованием операторов << и >>, поэтому целесообразно просто перегрузить глобальный оператор потокового ввода и оператор вывода для своего класса. Поэтому ваша программа для сохранения данных будет выглядеть вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <fstream>
#include <iostream>
#include <string>
using namespace std;
class ClassX {
    friend ostream& operator<<(ostream& os, const ClassX& cx);
    friend istream& operator>>(istream& is, ClassX& cx);
protected:
    int    x1;
    string str;
 
public:
    ClassX()
      : x1() {}
 
    void g_in() {
        cin >> x1;
        cin >> str;
    }
    void g_out() {
        cout << x1 << endl;
        cout << str << endl;
    }
};
 
ostream& operator<<(ostream& os, const ClassX& cx) {
    os << cx.x1 << endl;
    os << cx.str << endl;
    return os;
}
 
istream& operator>>(istream& is, ClassX& cx) {
    is >> cx.x1;
    is >> cx.str;
    return is;
}
 
int main() {
    ClassX sx;
    sx.g_in();
    ofstream ofs("file.dat", ios::binary);
    ofs << sx;
    sx.g_out();
    return 0;
}
А для получения данных для объекта вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <fstream>
#include <iostream>
#include <string>
using namespace std;
class ClassX {
    friend ostream& operator<<(ostream& os, const ClassX& cx);
    friend istream& operator>>(istream& is, ClassX& cx);
protected:
    int    x1;
    string str;
 
public:
    ClassX()
      : x1() {}
 
    void g_in() {
        cin >> x1;
        cin >> str;
    }
    void g_out() {
        cout << x1 << endl;
        cout << str << endl;
    }
};
 
ostream& operator<<(ostream& os, const ClassX& cx) {
    os << cx.x1 << endl;
    os << cx.str << endl;
    return os;
}
 
istream& operator>>(istream& is, ClassX& cx) {
    is >> cx.x1;
    is >> cx.str;
    return is;
}
 
int main() {
    ClassX sx;
    ifstream ifs("file.dat", ios::binary);
    ifs >> sx;
    sx.g_out();
    return 0;
}
0
25.10.2018, 23:09
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.10.2018, 23:09

Где в скрипте букса спрятан файл с кодом начисления баллов пользователю при чтении писем?
Где в скрипте букса спрятан файл с кодом начисления баллов пользователю при чтении писем? Как его...

как зовут файл, где имя дефолтоюзверя для phpmyadmin и его пароль и где этот файл валяется?
как зовут файл, где имя дефолтоюзверя для phpmyadmin и его пароль и где этот файл валяется?

Как узнать, где находится файл?
Запускаю я свою программу с аргументом C:\lol\haha\readme.txt. Так вот - как узнать, где находится...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.