Некорректный ввод строк из файла - C (СИ)
Формулировка задачи:
Имеется файл books.csv такого формата:
9666965348;Стругацкие;Град обреченный;10;5
5845908914;Керниган, Ритчи;Язык программирования С;13;10
Необходимо ввести каждый элемент, отделенный точкой с запятой в массив. Написал несколько функций, проверил, и получил казус, судя по всему, связанный с регулярным выражением. Имеется код тестовой функции
На выходе выдает:
В чем фишка?
Листинг программы
- #include <stdio.h>
- #include <stdlib.h>
- #include <locale.h>
- /* Структура для рабочей строки */
- struct book {
- char isbn[14];
- char name[100];
- char author[50];
- unsigned q_in;
- unsigned q_out;
- };
- struct book lib[50];
- //Тестовая фукция
- void test(){
- int i=0;
- FILE *table_r;
- table_r = fopen("books.csv", "r");
- 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){
- printf("%s;%s;%s;%u;%u\n", lib[i].isbn, lib[i].author, lib[i].name, lib[i].q_in, lib[i].q_out);
- i++;
- }
- fclose(table_r);
- system("pause");
- }
На выходе выдает:
Решение задачи: «Некорректный ввод строк из файла»
textual
Листинг программы
- //Тестовая фукция
- void test()
- {
- int i = 0, j = 0;
- char str[80];
- char fields[5][100];
- char *p;
- FILE *table_r;
- table_r = fopen("books.csv", "r");
- while (fgets(str, 80, table_r))
- {
- j = 0;
- p = strtok(str, ";\n");
- while (p != NULL)
- {
- strcpy(fields[j], p);
- p = strtok(NULL, ";\n");
- j++;
- }
- sscanf(fields[0], "%100[^\n]s", lib[i].isbn);
- sscanf(fields[1], "%100[^\n]s", lib[i].author);
- sscanf(fields[2], "%100[^\n]s", lib[i].name);
- sscanf(fields[3], "%u", &lib[i].q_in);
- sscanf(fields[4], "%u", &lib[i].q_out);
- printf("%s;%s;%s;%u;%u\n", lib[i].isbn, lib[i].author, lib[i].name, lib[i].q_in, lib[i].q_out);
- i++;
- }
- fclose(table_r);
- }
Объяснение кода листинга программы
- Объявлены переменные:
- i, j (счетчики)
- str (строка для чтения строки из файла)
- fields (массив строк для хранения значений из файла)
- p (указатель на текущий символ в строке)
- table_r (указатель на файл для чтения)
- lib (массив структур для хранения данных о книгах)
- Открывается файл
books.csv
для чтения. - В цикле while считываются строки из файла до тех пор, пока не достигнут конец файла.
- Внутри цикла счетчик j сбрасывается в 0.
- С помощью функции strtok разделяется строка на поля, разделенные символом
;
. - Каждое поле сохраняется в соответствующем массиве fields.
- После цикла while с помощью функции sscanf считываются значения полей в соответствующие переменные структуры lib.
- Выводятся значения переменных lib на экран.
- Счетчик i увеличивается на 1 после каждой итерации цикла.
- После окончания цикла while закрывается файл.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д