Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.71
Bretbas
189 / 48 / 7
Регистрация: 05.08.2013
Сообщений: 766
Завершенные тесты: 1
#1

Запись и чтение структуры с файла - C++

29.01.2014, 01:03. Просмотров 2136. Ответов 18
Метки нет (Все метки)

Привет всем.Столкнулся с проблема записи структуры в файл и чтения ее из файла.Вот сама структура:
C++
1
2
3
4
struct papa
{
vector<string> v;
};
Короче есть два exe-шника.Один записывает структуру в файл,вот main код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
...
void main()
{
fstream f("file",ios::out|ios:binary);
papa a;
string n;
for(int i = 0;i < 4; i++) // записываем 4 элемента в вектор
{
cin >> n;
a.v.push_back(n);
}
f.write(reinterpret_cast<char*>(&a),sizeof(a));
f.close();
}
...
Второй естественно считывает эту структуру с файла.Вот код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
...
void main()
{
fstream f1("file",ios::in |ios::binary);
do
{
papa b;
f1.read(reinterpret_cast<char*>(&b),sizeof(b));
for(int i = 0; i < b.v.size(); i++) //вывожу на экран вектор струтуры считанной с файла
cout << b.v[i];
}
while(!f1.eof());
f1.close();
}
...
Суть в том,что когда выпоняю сначало первый exe и записываю струтуру в файл,а потом когда хочу вторым exe-шником считать с файла эту структуру,то происходит ошибка считывания с файла информации.То есть 4 элемента вектора,которые я записал первым exe-шником не получается считать.
Как я только не пробовал сделать,ничего не получается.
Странно,если сделать так,что будет запись и чтение структуры в одной программе,то все работает!Вот как то так:
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
...
void main()
{
fstream f("file",ios::out|ios:binary);
papa a;
string n;
for(int i = 0;i < 4; i++) // записываем 4 элемента в вектор
{
cin >> n;
a.v.push_back(n);
}
f.write(reinterpret_cast<char*>(&a),sizeof(a));
f.close();
f1("file",ios::in|ios::binary);
do
{
papa b;
f1.read(reinterpret_cast<char*>(&b),sizeof(b));
for(int i = 0; i < b.v.size(); i++) //вывожу на экран вектор струтуры считанной с файла
cout << b.v[i];
}
while(!f1.eof());
f1.close();
}
...
А мне нужно именно в двух разных программах - одна для записи,другая для чтения.
Так вот вопрос:Помогите сделать?)И объясните в чем у меня трабл)
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.01.2014, 01:03     Запись и чтение структуры с файла
Посмотрите здесь:
Запись и чтение структуры из файла C++
C++ Запись структуры и её чтение из файла
Запись и чтение структуры в/из файла C++
C++ Запись/чтение вектора в/из файла.Структуры
Запись и чтение структуры из бинарного файла C++
Чтение структуры из файла и запись нового C++
Запись структуры и чтение из файла в структуру ( как бы лучше ) C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
29.01.2014, 01:16     Запись и чтение структуры с файла #2
Цитата Сообщение от Bretbas Посмотреть сообщение
И объясните в чем у меня трабл)
Классы, с такими полями, нельзя (без сериализации) бинарно писать/читать.
Bretbas
189 / 48 / 7
Регистрация: 05.08.2013
Сообщений: 766
Завершенные тесты: 1
29.01.2014, 02:34  [ТС]     Запись и чтение структуры с файла #3
какие классы?а как сделать тогда?
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
29.01.2014, 03:17     Запись и чтение структуры с файла #4
Цитата Сообщение от Bretbas Посмотреть сообщение
какие классы?
В данном случае, vector <string>.
Цитата Сообщение от Bretbas Посмотреть сообщение
а как сделать тогда?
В текстовом режиме.

Добавлено через 9 минут
Как-то так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
ofstream f("file");
    papa a;
    string n;
    
    for(int i = 0; i < 4; i++) // записываем 4 элемента в вектор
    {
        cin >> n;
        a.v.push_back(n);
    }
    
    f << a.v.size(); // записываем, в первую строку файла, размер вектора
    for(int i = 0; i < a.v.size(); i++) // записываем, построчно, строки из вектора в файл
    {
        f << a.v[i] << endl;
    }
    f.close();
Добавлено через 44 секунды
Класс надуман. Если там один вектор, то зачем такой класс нужен? Можно просто вектор использовать.

Добавлено через 9 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
ifstream f1("file");
    if (f1)
    {
        int n;
        while (f1 >> n)
        {
            papa b;
            string temp;
            for (int i = 0; i < n; ++i)
            {
                getline(f1, temp);
                b.v.push_back(temp);
            }
        
            for(int i = 0; i < b.v.size(); i++)  // вывожу на экран вектор струтуры считанной с файла
                cout << b.v[i];
        }
        f1.close();
    }
    else
        cout << "Error!" << endl;
Но это всё - информация к размышлению, направление, без уточнений, типа: а если не одна структура и т.д.
Bretbas
189 / 48 / 7
Регистрация: 05.08.2013
Сообщений: 766
Завершенные тесты: 1
29.01.2014, 22:03  [ТС]     Запись и чтение структуры с файла #5
Не подходит твой вариант.Я тут предоставил насколько можно сокращенный код моей программы.На самом деле у меня структура довольно большая(около 9 полей),поэтому мне нужно в файл записывать сразу объект структуры.Текстовой режим использовать не вариант,нужно только бинарный
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
29.01.2014, 22:54     Запись и чтение структуры с файла #6
Бинарный режим(без сериапизации), с такими полями (в частности, string) нормально работать не будет.

Добавлено через 9 минут
Чтобы понятно было. Когда делатеся, в main() вот такое объявление:
C++
1
vector <string> v;
, то по адресу &v, содержится объект vector<string> созданный на стеке, но содержимое этого вектора, будет находиться совсем не по этому адресу, а в динамической памяти. То же самое касается и string, которые будут содержаться в этом векторе. В самом векторе могут содержаться только указатели на строки, а сами строки могут быть совсем в другом месте. Если с вектором можно выкрутиться, вот так: &v[0] (получим начальный адрес содержимого вектора в динамической памяти), и тут уже можно будет применить бинарное чтение/запись, то со string такой номер не пройдёт.
Bretbas
189 / 48 / 7
Регистрация: 05.08.2013
Сообщений: 766
Завершенные тесты: 1
30.01.2014, 00:21  [ТС]     Запись и чтение структуры с файла #7
хорошо,понял)
Но реально хоть как-нибудь реализовать,то что я хочу?)как с помощью сериализации это осуществить?Я просто ниразу с этим не сталкивался...
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
30.01.2014, 00:44     Запись и чтение структуры с файла #8
Цитата Сообщение от Bretbas Посмотреть сообщение
как с помощью сериализации это осуществить?
Serialization: http://en.highscore.de/cpp/boost/

Добавлено через 1 минуту
Но советую не мучиться, а делать в текстовом режиме. То что там девять полей, это ничего не значит. Можно перегрузиить операторы чтения\записи для структуры, и делать всё одной строкой.
Bretbas
189 / 48 / 7
Регистрация: 05.08.2013
Сообщений: 766
Завершенные тесты: 1
30.01.2014, 22:58  [ТС]     Запись и чтение структуры с файла #9
все таки мне нужно в бинарном виде записывать структуру(
вы не подскажете маленький примерчик с сериализацией?чтобы я его воплотил в жизнь)
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
30.01.2014, 23:57     Запись и чтение структуры с файла #10
Цитата Сообщение от Bretbas Посмотреть сообщение
вы не подскажете маленький примерчик с сериализацией?
Примерчик в 4 посте.
Bretbas
189 / 48 / 7
Регистрация: 05.08.2013
Сообщений: 766
Завершенные тесты: 1
31.01.2014, 00:28  [ТС]     Запись и чтение структуры с файла #11
там же текстовой режим...мне нужен бинарный)
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
31.01.2014, 00:37     Запись и чтение структуры с файла #12
Цитата Сообщение от Bretbas Посмотреть сообщение
мне нужен бинарный)
Объясните понятно, зачем нужен?
gromo
31.01.2014, 00:44
  #13

Не по теме:

Цитата Сообщение от alsav22 Посмотреть сообщение
А там актуальная документация буст?

kulakaa
0 / 0 / 0
Регистрация: 23.01.2014
Сообщений: 10
31.01.2014, 00:54     Запись и чтение структуры с файла #14
Цитата Сообщение от alsav22 Посмотреть сообщение
Но советую не мучиться, а делать в текстовом режиме.
Сори за оффтоп, но не подскажете как? Я создал вектор, содержащий структуру с разными данными, записал данные структур в файл, но считать не могу...
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
31.01.2014, 00:57     Запись и чтение структуры с файла #15

Не по теме:

Цитата Сообщение от gromo Посмотреть сообщение
А там актуальная документация буст?
Без понятия.



Добавлено через 2 минуты
Цитата Сообщение от kulakaa Посмотреть сообщение
Сори за оффтоп, но не подскажете как?
4 пост.
Bretbas
189 / 48 / 7
Регистрация: 05.08.2013
Сообщений: 766
Завершенные тесты: 1
31.01.2014, 02:03  [ТС]     Запись и чтение структуры с файла #16
ну даже для того чтобы файл не могли прочитать с помощью простого текстового редактора)
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
31.01.2014, 02:33     Запись и чтение структуры с файла #17
Цитата Сообщение от Bretbas Посмотреть сообщение
ну даже для того чтобы файл не могли прочитать с помощью простого текстового редактора)
Если пишите текст (строки текста), то неважно в каком режиме их запишите, в бинарном или текстовом, в текстовом редакторе они всё равно будут видны как текст, потому что и в текстовом режиме, и в бинарном, пишутся коды (байты) символов.
Ещё причины?
Bretbas
189 / 48 / 7
Регистрация: 05.08.2013
Сообщений: 766
Завершенные тесты: 1
31.01.2014, 22:08  [ТС]     Запись и чтение структуры с файла #18
Тогда по идее причин нет,но наворачивается два вопроса:
1.зачем нужен тогда бинарный режим вообще,если есть текстовой?
2.при записи структуры в файл в текстовом режиме,мне разделитель между полями и элементами vector'а нужно самому придумать?или как сделать,чтобы это все менее затратно было?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.01.2014, 22:19     Запись и чтение структуры с файла
Еще ссылки по теме:
Ansi c, запись и чтение структуры из файла. Накосячил от души C++
Запись структуры в файл, чтение из файла и удаление (файловый ввод/вывод) C++
Чтение/запись структуры "Клиент" из текстового файла C++
Чтение/запись структуры C++
Запись\чтение структуры в\из файл(а) C++

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

Или воспользуйтесь поиском по форуму:
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
31.01.2014, 22:19     Запись и чтение структуры с файла #19
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Bretbas Посмотреть сообщение
2.при записи структуры в файл в текстовом режиме,мне разделитель между полями и элементами vector'а нужно самому придумать?
4 пост.
Цитата Сообщение от Bretbas Посмотреть сообщение
как сделать,чтобы это все менее затратно было?
Цитата Сообщение от alsav22 Посмотреть сообщение
Можно перегрузиить операторы чтения\записи для структуры, и делать всё одной строкой.
Цитата Сообщение от Bretbas Посмотреть сообщение
1.зачем нужен тогда бинарный режим вообще,если есть текстовой?
Читайте литературу. В некоторых источниках, файлы, записанные в бинарном режиме, называют файлами произвольного доступа, а файлы, записанные в текстовом режиме - файлами последовательного доступа.
Yandex
Объявления
31.01.2014, 22:19     Запись и чтение структуры с файла
Ответ Создать тему
Опции темы

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