@SUkI3

Как записать сразу всю структуру (содержащую string) в бинарный файл?

Пример структуры
struct anketa
{
    int year;
    string fio;
};

Структуру необходимо записать таким методом, чтобы потом запустить отдельно другую функцию, которая сможет прочитать файл, но перед этим не добавлять записи в файл(ну то есть чисто чтение)
Пробовала так: после того как пользователь введет string посчитать string.size() + 1 и приплюсовать sizeof(int), но после чтение из файла выдает какой-то бред
  • Вопрос задан
  • 4998 просмотров
Пригласить эксперта
Ответы на вопрос 2
@vanyamba-electronics
#include <iostream>
#include <fstream>      // std::fstream

using namespace std;

typedef struct
{
    int year;
    string fio;
} Anketa;

int main () 
{
  Anketa anketa;
  anketa.year = 1643;
  anketa.fio = "Isaac John Newton";
  
  // *** Writing ***
  fstream fs;
  fs.open ("anketa.dat", std::fstream::out | std::fstream::binary);

  fs.write((char*) &anketa.year, sizeof(int));
  size_t len = anketa.fio.length();
  fs.write((char*) &len, sizeof(size_t));
  fs.write(anketa.fio.data(), len);

  fs.close();

  // *** Reading *** 
  fs.open ("anketa.dat", std::fstream::in | std::fstream::binary);

  fs.read((char*) &anketa.year, sizeof(int));
  fs.read((char*) &len, sizeof(size_t));
  char buf[len+1];
  fs.read(buf, len);
  buf[len] = 0;
  anketa.fio = buf;

  fs.close();

  cout << anketa.year << " " << anketa.fio << endl;

  return 0;
}
Ответ написан
vt4a2h
@vt4a2h Куратор тега C++
Senior software engineer (C++/Qt/boost)
Ну для POD должно как-то так работать:
anketa a;

std::ofstream out(file_name);
out.write(reinterpret_cast<char*>(&a), sizeof(a));

// ...

std::ifstream in(file_name);
in.read(reinterpret_cast<char*>(&a), sizeof(a));

Но у вас там std::string есть, а его надо в char* преобразовать чтобы так записать. Это больше чем одна строчка. Поэтому, такие чтение/запись надо выносить в отдельные функции.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы