Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 17.12.2018
Сообщений: 16
1

Как правильно записать в бинарный файл структуру, в которой есть string?

08.06.2019, 23:57. Просмотров 929. Ответов 21

Предположим есть вот такая структура
C++
1
2
3
4
5
struct MyStruct
{
    int number;
    string str;
};
Её надо записать в бинарный файл, с таким условием что мы передаем всю структуру, а не отдельные её части для записи

Так работать не будет
C++
1
2
MyStruct ms;
file.read((char*)&ms,sizeof(MyStruct ));
Пробовала считывать размер того что вписал пользователь и это передать

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
cout<<"Vvedite kol-vo struct"<<endl;
    cin >> k;
    for(int i = 0; i<k; i++){
        cout<< i+1 <<" struct: " << endl;
        cout << "number\n";
        cin >> ms.number;
        cin.ignore();
        cout << endl << "str\n";
        getline(cin, ms.str, '\n');
        cin.clear();
        size = sizeof(ms.number) + ms.str.length() + 1;
        file.read((char*)&ms,sizeof(size));
        size = 0;
}
Лучше не стало, если запустить отдельно считывание из файла, выводит что-то не понятное
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.06.2019, 23:57
Ответы с готовыми решениями:

Как правильно сохранить и потом считать структуру в бинарный файл
Есть структура struct card { int size; char *lear; int *name; }; Эта структура это карты...

Как класс string записать в бинарный файл через вектор?
вопрос такой у меня есть класс. я создаю вектор по этому классу vector&lt;Employee&gt; work; вектор...

Как правильно записать символьный массив в бинарный файл?
Хочу записать в бинарный файл две строки. 1 - &quot;даня&quot;, 2 - &quot;маша&quot;. открываю так: ofstream...

Записать структуру в бинарный файл
ЛЮДИ подскажите кто знает,чувствую,что ответ где то рядом,а где найти не могу:( Пусть есть...

21
4925 / 3312 / 1394
Регистрация: 07.05.2019
Сообщений: 10,204
Записей в блоге: 1
09.06.2019, 11:08 2
Цитата Сообщение от varyahoch Посмотреть сообщение
Её надо записать в бинарный файл, с таким условием что мы передаем всю структуру, а не отдельные её части для записи
Нет, неправильно. Надо делать
C++
1
2
3
4
5
struct MyStruct
{
    int number;
    char str[NNNNN];
};
0
0 / 0 / 0
Регистрация: 17.12.2018
Сообщений: 16
09.06.2019, 11:10  [ТС] 3
Суть в том, что использовать надо именно string в структуре
0
4925 / 3312 / 1394
Регистрация: 07.05.2019
Сообщений: 10,204
Записей в блоге: 1
09.06.2019, 11:23 4
Цитата Сообщение от varyahoch Посмотреть сообщение
Суть в том, что использовать надо именно string в структуре
Тогда записать так не получится.
Надо записывать/начитывать по отдельным полям - число, строка (т.е. массив символов, с нулём на конце) и т.д.
0
0 / 0 / 0
Регистрация: 17.12.2018
Сообщений: 16
09.06.2019, 11:25  [ТС] 5
oleg-m1973, А вот именно алгоритм, чтобы записать сразу всю структуру, а не каждое поле возможно найти?
0
4925 / 3312 / 1394
Регистрация: 07.05.2019
Сообщений: 10,204
Записей в блоге: 1
09.06.2019, 11:31 6
Цитата Сообщение от varyahoch Посмотреть сообщение
А вот именно способ записать сразу всю структуру, а не каждое поле возможно найти?
Ну, чудес не бывает. Либо ты делаешь структуру с полями фиксированного размера и пишешь как есть, либо всё по-отдельности.
std::string - динамическая структура. Т.е сама структура отдельно, а строка отдельно.

Не очень понимаю твоего вопроса, но возможно тебе достаточно будет переопределить оператор <<
0
0 / 0 / 0
Регистрация: 17.12.2018
Сообщений: 16
09.06.2019, 11:35  [ТС] 7
oleg-m1973, я правильно поняла, то есть в память структуры не входит память выделенная под string? Это как?

И про переопределение операторов. Не разбираюсь от слова совсем, если вам не сложно можете дать ссылки, чтоб почитать про это?
0
4925 / 3312 / 1394
Регистрация: 07.05.2019
Сообщений: 10,204
Записей в блоге: 1
09.06.2019, 11:36 8
C++
1
2
3
MyStruct ms;
//file.read((char*)&ms,sizeof(MyStruct ));
file >> ms;
?
0
0 / 0 / 0
Регистрация: 17.12.2018
Сообщений: 16
09.06.2019, 11:37  [ТС] 9
А это же бинарный файл
0
4925 / 3312 / 1394
Регистрация: 07.05.2019
Сообщений: 10,204
Записей в блоге: 1
09.06.2019, 11:37 10
Цитата Сообщение от varyahoch Посмотреть сообщение
oleg-m1973, я правильно поняла, то есть в память структуры не входит память выделенная под string? Это как?
Да. Просто создай длинную строку std::string s("11234567890") и посмотри sizeof(s);
0
0 / 0 / 0
Регистрация: 17.12.2018
Сообщений: 16
09.06.2019, 11:40  [ТС] 11
Если я правильно помню, то она будет всегда одинакова, несмотря на то, какой длины
0
4925 / 3312 / 1394
Регистрация: 07.05.2019
Сообщений: 10,204
Записей в блоге: 1
09.06.2019, 11:42 12
Цитата Сообщение от varyahoch Посмотреть сообщение
И про переопределение операторов. Не разбираюсь от слова совсем, если вам не сложно можете дать ссылки, чтоб почитать про это?
Насчёт ссылок ,мне тут тяжеловато. Вот нашёл что-то в гугле https://ravesli.com/urok-133-p... -i-vyvoda/
0
0 / 0 / 0
Регистрация: 17.12.2018
Сообщений: 16
09.06.2019, 11:42  [ТС] 13
Если грубо сказать, то получается, что есть string в struct, что нет, они с собой не как не взаимодействуют или что?
0
4925 / 3312 / 1394
Регистрация: 07.05.2019
Сообщений: 10,204
Записей в блоге: 1
09.06.2019, 11:43 14
Цитата Сообщение от varyahoch Посмотреть сообщение
Если я правильно помню, то она будет всегда одинакова, несмотря на то, какой длины
Да, правильно. Т.е. напрямую в бинарный файл её писать нельзя. Подозреваю, тебе и не нужно
0
0 / 0 / 0
Регистрация: 17.12.2018
Сообщений: 16
09.06.2019, 11:47  [ТС] 15
oleg-m1973, мне надо записать структуру в бинарный, а то есть если я делаю string.length() и именно этот размер передам для записи от этого ничего не поменяется?
0
4925 / 3312 / 1394
Регистрация: 07.05.2019
Сообщений: 10,204
Записей в блоге: 1
09.06.2019, 11:49 16
Цитата Сообщение от varyahoch Посмотреть сообщение
Если грубо сказать, то получается, что есть string в struct, что нет, они с собой не как не взаимодействуют или что?
Есть переменная, которая указывает на массив (строку). Значение этой переменной, указателя, хранится в структуре (в std::string), сам массив - совершенно в другом месте.

Добавлено через 1 минуту
Цитата Сообщение от varyahoch Посмотреть сообщение
oleg-m1973, мне надо записать структуру в бинарный, а то есть если я делаю string.length() и именно этот размер передам для записи от этого ничего не поменяется?
Нет, не поменяется. Следом тебе нужно будет записать содержимое строки, массив. Ну и начитывать соответственно.
0
0 / 0 / 0
Регистрация: 17.12.2018
Сообщений: 16
09.06.2019, 11:50  [ТС] 17
Вообщем записать одной строчкой в файл, а потом соответственно считать никак не выйдет?(
0
4925 / 3312 / 1394
Регистрация: 07.05.2019
Сообщений: 10,204
Записей в блоге: 1
09.06.2019, 11:55 18
Цитата Сообщение от varyahoch Посмотреть сообщение
Вообщем записать одной строчкой в файл, а потом соответственно считать никак не выйдет?(
Смотря, что ты имеешь под одной строчкой.
Тупо записать, как кусок памяти - не получится.
Если переопределить операторы, то их использование будет в одну строчку
0
0 / 0 / 0
Регистрация: 17.12.2018
Сообщений: 16
09.06.2019, 12:00  [ТС] 19
Ну видимо именно как кусок памяти
например если б не было этого string, то та строчка работала б как часы, но это мы уже проходили
0
916 / 633 / 198
Регистрация: 08.09.2013
Сообщений: 1,690
09.06.2019, 13:51 20
Цитата Сообщение от varyahoch Посмотреть сообщение
Её надо записать в бинарный файл, с таким условием что мы передаем всю структуру, а не отдельные её части для записи
Выше, собственно, прозрачно разъяснили.
Подобное задание могло быть при изучении Сериализации.
Тогда, используя тот же Буст, как-то так
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
#include <iostream>
#include <fstream>
#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>
 
struct MyStruct
{
  int number;
  std::string str;
 
  MyStruct(){};
  MyStruct (int n, const std::string& s): number(n), str(s) {};
 
  template<class Archive>
  void serialize (Archive& ar, const unsigned int version)
  {
        ar & number;
        ar & str;
  }
};
 
int main() {
    MyStruct ms[] = {{17, "My Struct"}, {28, "New Structure"}};
 
    std::ofstream ofs("filename");
    boost::archive::binary_oarchive oa(ofs);
    oa << ms[0] << ms[1];
    ofs.close();
 
    MyStruct ms1, ms2;
    std::ifstream ifs("filename");
    boost::archive::binary_iarchive ia(ifs);
    ia >> ms1 >> ms2;
    std::cout << ms1.number << '\t' << ms1.str << '\n'
              << ms2.number << '\t' << ms2.str << '\n';
    return 0;
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.06.2019, 13:51

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

Записать структуру в бинарный файл
Всем доброго времени суток. у меня такая проблема, мне нужно перекинуть в бинарный файл структуру....

Не получается прочесть правильно текстовый файл в структуру а затем в бинарный файл
Нужно просто прочесть файл в структуру данных а потом оттуда записать в бинарный файл Вот как...

Как записать структуру в бинарный файл одним "блоком"
Как записать структуру в бинарный файл одним &quot;блоком&quot;, если в структуре есть private данные? ...

Правильно записать бинарный файл
У меня имеется структура с массивом типа unsigned char и строкой string. Я пытаюсь записать число...


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

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

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