Некорректный ввод строк из файла - C (СИ)

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

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

Имеется файл books.csv такого формата: 9666965348;Стругацкие;Град обреченный;10;5 5845908914;Керниган, Ритчи;Язык программирования С;13;10 Необходимо ввести каждый элемент, отделенный точкой с запятой в массив. Написал несколько функций, проверил, и получил казус, судя по всему, связанный с регулярным выражением. Имеется код тестовой функции
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <locale.h>
  4. /* Структура для рабочей строки */
  5. struct book {
  6. char isbn[14];
  7. char name[100];
  8. char author[50];
  9. unsigned q_in;
  10. unsigned q_out;
  11. };
  12. struct book lib[50];
  13. //Тестовая фукция
  14. void test(){
  15. int i=0;
  16. FILE *table_r;
  17. table_r = fopen("books.csv", "r");
  18. while((fscanf(table_r,"%s;%s;%s;%u;%u\n", lib[i].isbn, lib[i].author, lib[i].name, lib[i].q_in, lib[i].q_out)) != EOF){
  19. printf("%s;%s;%s;%u;%u\n", lib[i].isbn, lib[i].author, lib[i].name, lib[i].q_in, lib[i].q_out);
  20. i++;
  21. }
  22. fclose(table_r);
  23. system("pause");
  24. }
На выходе выдает: В чем фишка?
На выходе выдает:

Решение задачи: «Некорректный ввод строк из файла»

textual
Листинг программы
  1. //Тестовая фукция
  2. void test()
  3. {
  4.     int i = 0, j = 0;
  5.     char str[80];
  6.     char fields[5][100];
  7.     char *p;
  8.     FILE *table_r;
  9.     table_r = fopen("books.csv", "r");
  10.  
  11.    
  12.     while (fgets(str, 80, table_r))
  13.     {
  14.         j = 0;
  15.         p = strtok(str, ";\n");
  16.         while (p != NULL)
  17.         {
  18.             strcpy(fields[j], p);
  19.             p = strtok(NULL, ";\n");
  20.             j++;
  21.         }
  22.         sscanf(fields[0], "%100[^\n]s", lib[i].isbn);
  23.         sscanf(fields[1], "%100[^\n]s", lib[i].author);
  24.         sscanf(fields[2], "%100[^\n]s", lib[i].name);
  25.         sscanf(fields[3], "%u", &lib[i].q_in);
  26.         sscanf(fields[4], "%u", &lib[i].q_out);
  27.  
  28.         printf("%s;%s;%s;%u;%u\n", lib[i].isbn, lib[i].author, lib[i].name, lib[i].q_in, lib[i].q_out);
  29.         i++;
  30.     }
  31.     fclose(table_r);
  32.  
  33. }

Объяснение кода листинга программы

  1. Объявлены переменные:
    • i, j (счетчики)
    • str (строка для чтения строки из файла)
    • fields (массив строк для хранения значений из файла)
    • p (указатель на текущий символ в строке)
    • table_r (указатель на файл для чтения)
    • lib (массив структур для хранения данных о книгах)
  2. Открывается файл books.csv для чтения.
  3. В цикле while считываются строки из файла до тех пор, пока не достигнут конец файла.
  4. Внутри цикла счетчик j сбрасывается в 0.
  5. С помощью функции strtok разделяется строка на поля, разделенные символом ;.
  6. Каждое поле сохраняется в соответствующем массиве fields.
  7. После цикла while с помощью функции sscanf считываются значения полей в соответствующие переменные структуры lib.
  8. Выводятся значения переменных lib на экран.
  9. Счетчик i увеличивается на 1 после каждой итерации цикла.
  10. После окончания цикла while закрывается файл.

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


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

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

6   голосов , оценка 3.833 из 5

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

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

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