Некорректный ввод строк из файла - 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 закрывается файл.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д