fscanf возвращает 3 вместо -1 (EOF) в конце файла
Поскольку в последней строке отсутствует '\n'
.
Код OP "работает" с "tmp.txt"
, который составляет приведенный ниже код.
fscanf()
трудно использовать правильно. Проще кодировать и отлаживать с fgets()
. Обсуждение следует.
"%30[^,]"
допускает слишком много для char name[30]
. Используйте char name[30+1]
или "%29[^,]"
Подход OP может легко потерпеть неудачу с кажущимися незначительными проблемами синтаксического анализа, такими как отсутствие '\n'
в последней строке. После такого сбоя восстановление становится чрезвычайно трудным с fscanf()
Отладка: Важно, что нижеприведенная печать не должна выполняться, пока код не застрахован nscan >= 4
if (nscan >= 4) // add
printf("onoma: %s apousies: %d sxolia: %s terma: %c\n", name, apousies, comments, termch);
Вместо этого используйте fgets()
. С линиями ориентированными данными это действительно лучший первый шаг.
fscanf()
сложно использовать и справляться с ошибками. Гораздо проще прочитать строку с fgets()
и затем проанализировать.
Использование " %n"
- это хороший способ определить, разбирается ли все строка.
#include <stdio.h>
#include <stdlib.h>
#define M 100
typedef struct {
char name[30];
int apousies;
} studentT;
void readInput(FILE* infile, studentT students[], int *pApousies,
int *pStudents) {
(void) students;
(void) pApousies;
(void) pStudents;
int line = 0;
char buf[200];
while (fgets(buf, sizeof buf, infile)) {
int apousies;
char name[30], comments[68];
int n = 0;
line++;
sscanf(buf, " %29[^,],%d , %67[^\n] %n", name, &apousies, comments, &n);
if (n == 0 || buf[n]) {
fprintf(stderr, "Error in line %d <%s>. Program termination\n", line, buf);
exit(1);
}
printf("Success %d <%s> %d <%s>\n", line, name, apousies, comments);
}
}
Пример использования
int main() {
FILE *f = fopen("tmp.txt", "w");
fputs("CHRISTOU GIORGOS,140,VAS. OLGAS 112\n"
"MALAKOU MALAKOS,150,DRAS. BAGAS 12\n"
"TSIKOU GIJRAN,140,JABS. DRALGAS 1\n"
"TSIKOU BIRBAN,140,JABS. DRALGAS 1\n"
"DELHDHMHTRIOU SPYROS,50,SPEED. BAGAS 62\n"
"FOX SIN,40,BAN. NINJA 1\n", f);
fclose(f);
f = fopen("tmp.txt", "r");
studentT st[M];
readInput(f, st, NULL, NULL);
fclose(f);
}
выход
Success 1 <CHRISTOU GIORGOS> 140 <VAS. OLGAS 112>
Success 2 <MALAKOU MALAKOS> 150 <DRAS. BAGAS 12>
Success 3 <TSIKOU GIJRAN> 140 <JABS. DRALGAS 1>
Success 4 <TSIKOU BIRBAN> 140 <JABS. DRALGAS 1>
Success 5 <DELHDHMHTRIOU SPYROS> 50 <SPEED. BAGAS 62>
Success 6 <FOX SIN> 40 <BAN. NINJA 1>