Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.71
Bretbas
Каждому свое
348 / 118 / 31
Регистрация: 05.08.2013
Сообщений: 1,245
Завершенные тесты: 1
#1

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

29.01.2014, 01:03. Просмотров 2292. Ответов 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)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.01.2014, 01:03
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Запись и чтение структуры с файла (C++):

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

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

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

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

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

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

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

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

Не по теме:

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

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

Не по теме:

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



Добавлено через 2 минуты
Цитата Сообщение от kulakaa Посмотреть сообщение
Сори за оффтоп, но не подскажете как?
4 пост.
1
31.01.2014, 00:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.01.2014, 00:57
Привет! Вот еще темы с ответами:

Ansi c, запись и чтение структуры из файла. Накосячил от души - C++
Прошу прощения за глупую тему, но я мучаюсь уже долго, сам не могу решить проблему. структура struct rent { char...

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

Запись структуры в файл, чтение из файла и удаление (файловый ввод/вывод) - C++
Добрый вечер! Возникла такая проблема, что при добавлении записи, удаляются уже имеющиеся записи в файле. Также не помешала бы помощь в...

Чтение/запись структуры "Клиент" из текстового файла - C++
Здравствуйте. Помогите вывести данные из текстового файла обратно в программу. У меня есть некая структура, и функция которая пишет...


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

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

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