Как исправить ошибку с построчным чтением из бинарного файла C++?

Есть функция введения (input):
void input() {
	ofstream In("AutoBase.txt", ios::binary);
	char k = '+';
	AutoBase a;
	string Read;
	while (k == '+') {
		cout << "Enter name of car: "; getline(cin, a.Name);
		cout << "Enter Release Date with a point '10.10.2010': "; getline(cin, Read);
		a = Divide(a, Read, 0);
		cout << "Enter Sale Release Date with a point '10.10.2010': "; getline(cin, Read);
		a = Divide(a, Read, 1);
		cout << "Enter '+' in case you want to contnue: "; cin >> k;
                In.write((char*)&a, sizeof(AutoBase));
		cin.ignore();
	}
	In.close();
}
AutoBase Divide(AutoBase a, string Read, bool b) {
	int pos1 = Read.find('.');
	int pos2 = Read.rfind('.');
	if (!b) {
		a.Release.day = stoi(Read.substr(0, pos1));
		a.Release.mounth = stoi(Read.substr(pos1 + 1, pos2));
		a.Release.year = stoi(Read.substr(pos2 + 1));
	}
	else {
		a.SaleRelease.day = stoi(Read.substr(0, pos1));
		a.SaleRelease.mounth = stoi(Read.substr(pos1 + 1, pos2));
		a.SaleRelease.year = stoi(Read.substr(pos2 + 1));
	}
	return a;
}


Есть сама структура:
struct Data {
	int year;
	int mounth;
	int day;
};
struct AutoBase {
	string Name;
	Data Release;
	Data SaleRelease;
};


И я пытаюсь написать функцию вывода(output):
void output(string name) {
	ifstream Out(name, ios::binary);
	AutoBase a;
	while (Out.read((char*)&a, sizeof(AutoBase))) {
		cout << endl << a.Name << "   " << a.Release.day << "." << a.Release.mounth << "." << a.Release.year << "   " << 
                a.SaleRelease.day << "." << a.SaleRelease.mounth << "." << a.SaleRelease.year;
	}
	Out.close();
}

Так вот: после вывода текста из файла вылазит ошибка
6228cb96da98c393544151.png
  • Вопрос задан
  • 153 просмотра
Решения вопроса 1
@res2001
Developer, ex-admin
  1. Хорошо бы код спрятать под тег code (есть кнопка в панели инструментов) и вернуть разметку, не возможно читать.
  2. Не видна последовательность вызовов input() и output().
  3. В input() файл открываете на запись, но ничего туда не пишете, в итоге файл пустой.
  4. В output вы не правильно читаете:

Суть в том, что тип string хранит саму строку в динамической памяти, а не в самом объекте (в объекте только указатель на динамическую память). string у вас используется в AutoBase.
Тем способом, которым вы пытаетесь читать из файла вы прочитаете какой-то указатель и скорее всего будет обращение к не выделенной памяти и программа упадет. Подозреваю, что запись вы бы реализовали так же и в файл записался бы указатель, а не строка.
Вам надо читать и писать объект string по другому. Есть 2 варианта:
  • Сначала пишем/читаем размер строки, затем пишем/читаем саму строку заданного размера.
  • Пишем всю строку, в конце дописываем какой-то разделитель. В качестве разделителя можно использовать символ '\0', так же как в сырых Си строках или то что вам больше нравится, лишь бы разделитель не мог содержаться в самой строке. При чтении надо читать побайтно, до тех пор пока не встретится символ разделитель.

Какой вариант реализовывать решать вам.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы