Создать базу данных мониторов - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Имеется курсач - создать базу данных мониторов. Сейчас надо организовать бинарный файловый ввод/вывод структуры с помощью fread()/fwrite(). Память под записи выделяется динамически, записи объединены двусвязным списком. Проблемы сейчас следующие: 1) не работает

while( !feof(fp) )

: (строка 79 ) - при открытии пустого файла пропускает в цикл; - при открытии файла с записями при достижении (?) конца файла опять пропускает в цикл; Не понимаю, где находится маркер потока ввода после открытия файла. При добавлении

putc(fp)

начинает ловить EOF пустого файла, в записанном, естественно, съедает первый байт и на выводе получается каша. Пробовал сдвигать маркер ввода

fseek()

на 1, 2 и 3 байта - всё-равно пропускает в цикл. Получается при открытии файла маркер потока ввода находиться за файлом (вроде равен нулю, а не первому байту, где стоит EOF) или как? 2) После считывания записей из файла убивает сортировки записей (пузырьком и вставками ) в

segmentation fault

. Код сортировок здесь не привожу, смысла нет. Просто подскажите в каком виде эта считанная из файла структура попадает в память: становятся ли бывшие строки строками, приводятся ли числа к своим типам. В той же сортировке пузырьком по полю

size[]

ошибку выбивает на первом же этапе сравнения строк по длине через

strlen()

. Тут у меня никаких идей нет, разве что строки не закрыты '\0'? Код такой:
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. struct base
  5. {
  6. char name[30];
  7. float power;
  8. char size[11];
  9. unsigned long long int color;
  10. struct base * next, * prev;
  11. };
  12. struct base * load( FILE * , struct base * ); /* функция считывания из файла */
  13. void close( FILE * , struct base * , struct base * , struct base * , const char * const ); /* функция записи в файла */
  14. int main( int argc , char * argv[] )
  15. {
  16. unsigned short num;
  17. struct base * first = NULL , * begin = NULL , * last = NULL;
  18. FILE * fp = NULL;
  19. /* обработка открытия файла */
  20. if( argc != 2 )
  21. {
  22. fputs("\n################################################################\n"
  23. "## Файл для сохранения БД отсутствует! ##\n"
  24. "## После закрытия программы вся работа с БД будет утеряна! ##\n"
  25. "## Для подключения файла введите первым ключом его имя. ##\n"
  26. "################################################################\n" , stdout);
  27. fputs("\nДля продолжения нажмите Enter...\n" , stdout);
  28. getchar();
  29. }
  30. else if( argc == 2 && ( fp = fopen( argv[1] , "rb+") ) == NULL )
  31. {
  32. printf("Файл недоступен - %s\n", argv[1]);
  33. exit(1);
  34. }
  35. else if( argc == 2 && fp != NULL )
  36. {
  37. fprintf(stdout , "Файл \"%s\" открыт для считывания...\n", argv[1]);
  38. first = load( fp , first );
  39. /* флаг начального указателя; если begin и first различны - переписать файл БД */
  40. begin = first;
  41. /* последный указатель на данные из файла */
  42. for( last = first ; first != NULL && last->next != NULL ; last = last->next );
  43. }
  44.  
  45. /* далее меню */
  46. while( 1 )
  47. {
  48. system("clear");
  49. fputs("Работа с базой данных мониторов.\n"
  50. "\nВыберите нужный пункт:\n"
  51. /* часть кода пропущена */
  52. "9. Завершить работу с базой.\n" , stdout);
  53. while( scanf("%hu", &num) != 1 || num == 0 || num > 9 )
  54. { puts("Неверный ввод!\nПовторите ввод:"); getchar(); }
  55. system("clear");
  56. switch(num)
  57. {
  58. /* часть кода пропущена */
  59. case 9: close( fp , begin , first , last , argv[1] );
  60. fputs("Работа завершена!\n" , stdout);
  61. exit(0);
  62. }
  63. }
  64. }
  65. struct base * load( FILE * fp , struct base * first )
  66. {
  67. unsigned int num = 0;
  68. struct base * current, * down = NULL;
  69. while( !feof(fp) ) /* почему-то не работает? */
  70. {
  71. /* динамически выделяется память */
  72. current = (struct base *) malloc( sizeof(struct base) );
  73. if( current == NULL )
  74. {
  75. fputs("Ошибка инициализации памяти!\n" , stderr);
  76. exit(2);
  77. }
  78. if( first == NULL )
  79. first = current; /* флаг первой записи */
  80. else if( down == NULL ) /* в этом входе в load() записи ещё не вводились! */
  81. {
  82. down = first;
  83. while( down->next != NULL ) /* пробежда имеющихся записей при каждом входе в функцию */
  84. {
  85. down = down->next;
  86. num++;
  87. }
  88. num++;
  89. down->next = current;
  90. }
  91. else
  92. down->next = current;
  93. current->next = NULL;
  94. current->prev = down;
  95. down = current; /* в начале цикла создастся новый current */
  96.  
  97. /* начинает считывать из файла */
  98. if( fread( current , sizeof(struct base) , 1 , fp ) != 1 )
  99. {
  100. if( feof(fp) )
  101. break;
  102. fprintf( stderr , "Запись #%u.\nОшибка считывания!\n" , num);
  103. exit(3);
  104. }
  105. else
  106. num++;
  107. }
  108. num ? fprintf(stdout , "Из файла считано %u записей.\n", num) : fputs("Файл пуст.\n" , stdout);
  109. fputs("\nДля продолжения нажмите Enter...\n" , stdout);
  110. getchar();
  111. return first;
  112. }
  113. /* указ. на 1-ю запись из файла , текущий 1-ый указ. БД , указ. на последнюю запись из файла */
  114. void close( FILE * fp , struct base * begin , struct base * current , struct base * last , const char * const argv )
  115. {
  116. unsigned int num;
  117. if( fp != NULL )
  118. {
  119. /* если begin и first различны - переписать файл БД */
  120. if( current != begin )
  121. {
  122. rewind(fp);
  123. last = current;
  124. }
  125. else
  126. last = last->next;
  127. for( num = 1 ; last != NULL ; ++num , last = last->next )
  128. if( fwrite( last , sizeof(struct base) , 1 , fp ) != 1 )
  129. {
  130. fprintf( stderr , "Запись #%u.\nОшибка записи!\n" , num );
  131. exit(3);
  132. }
  133. if( fclose(fp) != 0 )
  134. {
  135. fprintf(stderr , "Невозможно сохранить файл - %s\n", argv);
  136. exit(1);
  137. }
  138. }
  139. while( current != NULL )
  140. {
  141. free(current);
  142. current = current->next;
  143. }
  144. return;
  145. }

Решение задачи: «Создать базу данных мониторов»

textual
Листинг программы
  1. if( feof(fp) )

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4.143 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут