Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.90/21: Рейтинг темы: голосов - 21, средняя оценка - 4.90
Каждому свое
530 / 216 / 81
Регистрация: 05.08.2013
Сообщений: 1,613
1

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

29.01.2014, 01:03. Просмотров 3963. Ответов 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();
}
...
А мне нужно именно в двух разных программах - одна для записи,другая для чтения.
Так вот вопрос:Помогите сделать?)И объясните в чем у меня трабл)
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.01.2014, 01:03
Ответы с готовыми решениями:

Запись и чтение структуры из файла
Здравствуйте, у меня дано такое задание: Составить программу &quot;Список студентов группы&quot;, в котором...

Запись структуры и её чтение из файла
пробовал разными способами, ничего не работает, не записывает и не считывает...

Запись и чтение структуры в/из файла
Столкнулся с очередной проблемой. Есть несколько участков кода: Структура &quot;Абонент&quot;: struct...

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

18
5477 / 4872 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
29.01.2014, 01:16 2
Цитата Сообщение от Bretbas Посмотреть сообщение
И объясните в чем у меня трабл)
Классы, с такими полями, нельзя (без сериализации) бинарно писать/читать.
0
Каждому свое
530 / 216 / 81
Регистрация: 05.08.2013
Сообщений: 1,613
29.01.2014, 02:34  [ТС] 3
какие классы?а как сделать тогда?
0
5477 / 4872 / 831
Регистрация: 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;
Но это всё - информация к размышлению, направление, без уточнений, типа: а если не одна структура и т.д.
2
Каждому свое
530 / 216 / 81
Регистрация: 05.08.2013
Сообщений: 1,613
29.01.2014, 22:03  [ТС] 5
Не подходит твой вариант.Я тут предоставил насколько можно сокращенный код моей программы.На самом деле у меня структура довольно большая(около 9 полей),поэтому мне нужно в файл записывать сразу объект структуры.Текстовой режим использовать не вариант,нужно только бинарный
0
5477 / 4872 / 831
Регистрация: 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 такой номер не пройдёт.
1
Каждому свое
530 / 216 / 81
Регистрация: 05.08.2013
Сообщений: 1,613
30.01.2014, 00:21  [ТС] 7
хорошо,понял)
Но реально хоть как-нибудь реализовать,то что я хочу?)как с помощью сериализации это осуществить?Я просто ниразу с этим не сталкивался...
0
5477 / 4872 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
30.01.2014, 00:44 8
Цитата Сообщение от Bretbas Посмотреть сообщение
как с помощью сериализации это осуществить?
Serialization: http://en.highscore.de/cpp/boost/

Добавлено через 1 минуту
Но советую не мучиться, а делать в текстовом режиме. То что там девять полей, это ничего не значит. Можно перегрузиить операторы чтения\записи для структуры, и делать всё одной строкой.
0
Каждому свое
530 / 216 / 81
Регистрация: 05.08.2013
Сообщений: 1,613
30.01.2014, 22:58  [ТС] 9
все таки мне нужно в бинарном виде записывать структуру(
вы не подскажете маленький примерчик с сериализацией?чтобы я его воплотил в жизнь)
0
5477 / 4872 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
30.01.2014, 23:57 10
Цитата Сообщение от Bretbas Посмотреть сообщение
вы не подскажете маленький примерчик с сериализацией?
Примерчик в 4 посте.
0
Каждому свое
530 / 216 / 81
Регистрация: 05.08.2013
Сообщений: 1,613
31.01.2014, 00:28  [ТС] 11
там же текстовой режим...мне нужен бинарный)
0
5477 / 4872 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
31.01.2014, 00:37 12
Цитата Сообщение от Bretbas Посмотреть сообщение
мне нужен бинарный)
Объясните понятно, зачем нужен?
0
gromo
31.01.2014, 00:44
  #13

Не по теме:

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

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

Не по теме:

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



Добавлено через 2 минуты
Цитата Сообщение от kulakaa Посмотреть сообщение
Сори за оффтоп, но не подскажете как?
4 пост.
1
Каждому свое
530 / 216 / 81
Регистрация: 05.08.2013
Сообщений: 1,613
31.01.2014, 02:03  [ТС] 16
ну даже для того чтобы файл не могли прочитать с помощью простого текстового редактора)
0
5477 / 4872 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
31.01.2014, 02:33 17
Цитата Сообщение от Bretbas Посмотреть сообщение
ну даже для того чтобы файл не могли прочитать с помощью простого текстового редактора)
Если пишите текст (строки текста), то неважно в каком режиме их запишите, в бинарном или текстовом, в текстовом редакторе они всё равно будут видны как текст, потому что и в текстовом режиме, и в бинарном, пишутся коды (байты) символов.
Ещё причины?
0
Каждому свое
530 / 216 / 81
Регистрация: 05.08.2013
Сообщений: 1,613
31.01.2014, 22:08  [ТС] 18
Тогда по идее причин нет,но наворачивается два вопроса:
1.зачем нужен тогда бинарный режим вообще,если есть текстовой?
2.при записи структуры в файл в текстовом режиме,мне разделитель между полями и элементами vector'а нужно самому придумать?или как сделать,чтобы это все менее затратно было?
0
5477 / 4872 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
31.01.2014, 22:19 19
Лучший ответ Сообщение было отмечено Bretbas как решение

Решение

Цитата Сообщение от Bretbas Посмотреть сообщение
2.при записи структуры в файл в текстовом режиме,мне разделитель между полями и элементами vector'а нужно самому придумать?
4 пост.
Цитата Сообщение от Bretbas Посмотреть сообщение
как сделать,чтобы это все менее затратно было?
Цитата Сообщение от alsav22 Посмотреть сообщение
Можно перегрузиить операторы чтения\записи для структуры, и делать всё одной строкой.
Цитата Сообщение от Bretbas Посмотреть сообщение
1.зачем нужен тогда бинарный режим вообще,если есть текстовой?
Читайте литературу. В некоторых источниках, файлы, записанные в бинарном режиме, называют файлами произвольного доступа, а файлы, записанные в текстовом режиме - файлами последовательного доступа.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.01.2014, 22:19

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Запись/чтение вектора в/из файла.Структуры
Доброе время суток.Проблема заключается в следующем: в файл идет запись вектора (запись вроде-бы...

Чтение структуры из файла и запись нового
Из файла вводятся записи структурой имя - стринг, ТК - место работы тоже структура из AS - место...

Чтение структуры из файла и запись нового - C++
Помогите написать данную программу. На магнитном диске подготовлен файл данных такой структуры:...

Запись структуры и чтение из файла в структуру ( как бы лучше )
Подкиньте идею как лучше записать структуру в файл и обратно из файла в структуру У меня есть...


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

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

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