Некорректный ввод строк из файла - 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 закрывается файл.