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

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

  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
Похожие ответы