В настоящее время я изучаю C и немного нуждаюсь в помощи с моим кодом.Ошибка сегментации в результате использования fgets() для чтения строк из файла в массив структур
Скажем, есть файл под названием «books.txt», который содержит имена нескольких книг каждый в новой строке файла. Я пытаюсь захватить имена каждой книги для использования в остальной части моей программы.
Для этого я создал следующие ударил:
struct bookData { // This is my struct to encapsulate book information
char name[50]; // Name of book
// Other struct variable
// Other struct variable
};
Теперь мне нужно получить имена каждой книги и поместить их в массив структуры. Ниже я рассказываю, как я это делал.
struct bookData booksList[numBooks]; // numBooks is the number of books in "books.txt"
int i;
for(i = 0; i < numBooks; i++) {
fgets(booksList[i].name, 50, books);
// Books is the "books.txt" file that was opened for reading
}
Когда я запускаю этот код, я сталкиваюсь с ошибкой сегментации. Я считаю, что проблема заключается в использовании цикла for. Однако я не уверен, как исправить эту проблему или даже почему цикл вызывает ошибку сегментации. Когда я просто поместить строку,
fgets(booksList[0].name, 50, books);
без для петли, ошибка не происходит, и запускает код и печатает название книги просто отлично.
Я пытаюсь понять, почему в моем коде возникает ошибка. Я был бы очень благодарен, если бы кто-нибудь мог дать мне совет о том, как исправить ошибку. Заранее спасибо за то, что нашли время, чтобы прочитать/ответить на мой вопрос!
EDIT: numBooks - это, по сути, количество строк в файлах «books.txt». Это приводит к количеству книг для этой конкретной проблемы. numBooks рассчитывался по следующему коду:
char c;
int numBooks;
while((c = fgetc(books)) != EOF) {
if(c == '\n') {
numBooks++;
}
}
EDIT # 2: Спасибо всем за вашу помощь !!!
Что такое 'numBooks'? Как извлекается его ценность? – LPs
Почему бы не использовать отладчик и выяснить, какая именно строка кода порождает ошибку? – DyZ
Если список книг находится в стеке, а Numbooks - большой, вы можете бежать из стеков. Кроме того, после вашего возвращения данные в стеке исчезли, но вы вернули указатель на него. –