tarased
@tarased

С чем может быть связана ошибка доступа к чтению файла?

Не понимаю один момент, который заключается в следующем: мне необходимо получить данные из двоичного файла (.bin), куда раннее были записаны данные в виде двух строчек string и двух чисел int (структуры, в общем), при исполнении кода:
void Opf() {
	if ((fl = fopen(flName, "rb")) == NULL) {
		cout << "Ошибка открытия файла..." << endl;
		exit(1);
	}
	nst = 0;
	TBook book;
	while (true)
	{
		int nwrt = fread(&book, sizeof(TBook), 1, fl);
		if (nwrt != 1) { break; }
		books[nst] = book;
		cout << books[nst].name << " " << " " << books[nst].author << " " 
			<< books[nst].yearof << " " << books[nst].pages << endl;
		nst++;
	}
	fclose(fl);
}


Выдаёт следующую ошибку:
Вызвано необработанное исключение: нарушение доступа для чтения.
**_Pnext** было 0x61747353.


В чём может быть ошибка или же как можно это обойти?
  • Вопрос задан
  • 1591 просмотр
Пригласить эксперта
Ответы на вопрос 2
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
books[nst] = book;
В чём может быть ошибка

в том, что в контейнере books не выделено место для nst объектов.

раннее были записаны данные в виде двух строчек string и двух чисел int (структуры, в общем)

ну и структуру бы ты показал заодно, а то мало ли, вдруг у тебя там и в самом деле std::string, а значит вся затея с fread обречена на провал.
Ответ написан
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
string внутри себя содержит указатели. Поэтому его нельзя просто записывать и читать fread.
После того, как вы переменную типа string прочитали, там указатели стали указывать туда же, куда структура при записи. А эта память уже может быть занята чем-то другими или не доступна. При выводе вы обращаетесь по этим указателям и получаете крэш.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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