Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
7 / 4 / 4
Регистрация: 27.03.2017
Сообщений: 131
1

Запись в связный список из файла

09.08.2017, 01:21. Показов 1201. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Описание списков:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
typedef struct name
{
    char first_name[MAX_NAME];
    char last_name[MAX_NAME];
    int score;
    struct name *next;
    struct name *prev;
} Name;
 
typedef struct DblLinkedList {
    size_t size;
    Name *head;
    Name *tail;
} DblLinkedList;
Функция чтения файла:
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
Name * load_from_file(Name * node, DblLinkedList *list, const size_t *count_names, char * filename)
{
    
    FILE *fp = NULL;
    node = list->head;
    size_t count;
 
    if ((fp = fopen(filename, "rb"))  == NULL)    
    {
        printf("\nCan't open the file\n");
        exit(EXIT_FAILURE);
    }
    
    for (count = 0; count < *count_names; ++count)
    {
        fread(node, sizeof(Name), 1, fp);
        node = node->next;
    }
      
    if(fclose(fp) != 0)
    {
      printf("\nCan't close the file in a correct way\n");
      exit(EXIT_FAILURE);
    }
    
    return node;    
}
}
Функция вызова:
C
1
2
3
4
5
6
7
case '2':
      {
        names = load_from_file(names, linked_names, &count_names, filename);
        Printstruct(linked_names, linked_names->size);
        main_menu();
        break;
      }
При выборе данной функци программы возникает следующая ошибка:
” terminated by signal SIGSEGV (Address boundary error)
Некоторые люди пишут, что такая ошибка происходит часто ввиду разыменовывания недоступного указателя, но, видимо к этой проблеме моя проблема отношения не имеет.

Мне кажется, что слабое место находится здесь:
C
1
2
3
4
5
  for (count = 0; count < *count_names; ++count)
    {
        fread(node, sizeof(Name), 1, fp);
        node = node->next;
    }
При запуске printf в цикле, при count_names = 4 count доходит до 2, после чего возникает ошибка. Список, который я перед этим передал в файл, содержит три узла.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.08.2017, 01:21
Ответы с готовыми решениями:

Связный список. Необходимо создать новый связный список только из положительных элементов
Задача: Прочитать из файла связный список. Потом из этого списка создать еще один, в котором будут...

Связный список: вставить в список перед каждым вхождением элемента K элемент L
Разработать программу, которая создает список, элементами которого являются целые числа. ...

Связный список, объясните ошибки
#include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt; string.h &gt; #include &lt;assert.h&gt; typedef...

Удалить связный список и освободить память
Вот так создаю связный список typedef struct { comp el; void* next; } list; list* first =...

1
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
09.08.2017, 11:40 2
Цитата Сообщение от CarbonBased Посмотреть сообщение
Некоторые люди пишут, что такая ошибка происходит часто ввиду разыменовывания недоступного указателя
Правильно пишут. Именно это и происходит в строке
Цитата Сообщение от CarbonBased Посмотреть сообщение
C
1
node = node->next;
поскольку значение указателя node->next считывается из файла, а значит оно (значение указателя) уже не является актуальным (если бы оно было актуальным, то не было бы смысла считывать список из файла).

И вообще, сохранять в файле значения указателей - плохая идея. После завершения программы эти адреса становятся бесполезными.
0
09.08.2017, 11:40
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.08.2017, 11:40
Помогаю со студенческими работами здесь

Написать программу, которая реализует связный список
Написать программу, которая реализует связный список. Операции, которые должна выполнять программа:...

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

Связный список и структуры: В процессе сортировки программа виснет
#include&lt;stdio.h&gt; #include&lt;conio.h&gt; #include&lt;stdlib.h&gt; #include&lt;string.h&gt; struct digit{char...

Написать функцию, которая добавляет новый элемент в связный список
Доброго времени суток, продолжаю изучать самостоятельно Си по книге Кочана Стефана &quot;Язык...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru