проблема сканирования и сканирования данных из файла - PullRequest
0 голосов
/ 14 января 2020

У меня проблемы с извлечением данных из файла, я не понимаю, в чём дело, он отлично работает для одиночных целых чисел di git, но когда вводится двойное число di git, это не так сканировать целые числа. Все остальное работает.

Предположим, что ввод:

abc de,1,2,y

, тогда вывод:

"ab c de" 1 2 года, но когда ввод is

cde abc,21.31,y

сканирование не выполняется %d:

fin1 = fscanf(fp1, "%20[^,]%*c%d %*c %d%*c %c%*c", name1, &code1, &season, &relevant);

Справка была бы полезной. Также некоторые входные данные, как вы просили:

Ввод:

The Universe,2,3,Y|Zoo,7,3,N|The Hobbit,10,2,Y|True Lies,12,25,N|Animals,22,2,Y| Euphoria,35,5,Y

Код :

FILE *fp1, *fserie;
char file1name[256], name1[21], relevant = 0, active = 0;
int code1, seasons, fin = 0,

while (1) {
    puts("Enter First File Name:");
    scanf("%s", file1name);

    if (!(fp1 = fopen(file1name, "r")))
    {
        printf("error in opening file %s !!!\n", file1name);
        continue;

    } else break;
}

if (!(fserie = fopen("series.txt", "w")))
{
    fclose(fp1);
    exit(1);
}

do
{
    fin1 = fscanf(fp1,"%20[^,]%*c %d%*c %d%*c %c%*c", name1, &code1, &season, &active1);

    if (relevant == 'y')
        fprintf(fserie,"%s,%d,%d\n", name1, code1, season);

} while (fin1 != EOF && fin2 != EOF);

1 Ответ

1 голос
/ 14 января 2020

Проблема, с которой вы столкнулись, заключается в вашей строке формата и невозможности проверить чтение по всем 4 успешным преобразованиям за итерацию. Для вашей строки формата вы можете использовать:

" %20[^,],%d,%d,%c|"

(начальный пробел необязателен, но необходим, если у вас есть пробел после '|' перед следующим именем. Также обратите внимание, если у вас есть пробел окружая последний символ active, вы можете справиться с этим, включив пробел в строку формата, чтобы использовать все пробелы, например " %20[^,],%d,%d, %c |")

Пример чтения строки с несколькими наборами mov ie информация может быть:

#include <stdio.h>

#define MAXN 21     /* if you need a constant, #define one (or more) */

int main (int argc, char **argv) {
    char name[MAXN], active;
    int code, seasons;
    /* use filename provided as 1st argument (stdin by default) */
    FILE *fp = argc > 1 ? fopen (argv[1], "r") : stdin;

    if (!fp) {  /* validate file open for reading */
        perror ("file open failed");
        return 1;
    }

    while (fscanf (fp, " %20[^,],%d,%d,%c|", 
                    name, &code, &seasons, &active) == 4) {
        printf ("\nname   : %s\ncode   : %d\nseason : %d\nactive : %c\n",
                name, code, seasons, active);
    }

    if (fp != stdin)   /* close file if not stdin */
        fclose (fp);
}

Пример входного файла

$ cat dat/movies.txt
The Universe,2,3,Y|Zoo,7,3,N|The Hobbit,10,2,Y|True Lies,12,25,N|Animals,22,2,Y| Euphoria,35,5,Y

Пример использования / Вывод

$ ./bin/readmovies dat/movies.txt

name   : The Universe
code   : 2
season : 3
active : Y

name   : Zoo
code   : 7
season : 3
active : N

name   : The Hobbit
code   : 10
season : 2
active : Y

name   : True Lies
code   : 12
season : 25
active : N

name   : Animals
code   : 22
season : 2
active : Y

name   : Euphoria
code   : 35
season : 5
active : Y

Посмотрите вещи и дайте мне знать, если у вас есть дополнительные вопросы. Существует несколько способов сделать это, но это наиболее близко к вашему оригиналу.

...