Проблема, с которой вы столкнулись, заключается в вашей строке формата и невозможности проверить чтение по всем 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
Посмотрите вещи и дайте мне знать, если у вас есть дополнительные вопросы. Существует несколько способов сделать это, но это наиболее близко к вашему оригиналу.