fscanf(input_fp, "%30[^ ,\n\t]%30[^ ,\n\t]%30[^ ,\n\t]", ...
не использует ни ',', ни '\ n' в текстовом файле. Последующие попытки fscanf () также дают сбой и возвращают значение 0, которое, не будучи EOF, вызывает бесконечный цикл.
fscanf()
решение для fgets()/sscanf()
лучше обрабатывает потенциальные ошибки ввода-вывода и синтаксического анализа:
main()
{
FILE *input_fp;
FILE *output_fp;
char buf[100];
while (fgets(buf, sizeof buf, input_fp) != NULL)
{
char name[30]; // Insure this size is 1 more than the width in scanf format.
char age_array[30];
char occupation[30];
#define VFMT " %29[^ ,\n\t]"
int n; // Use to check for trailing junk
if (3 == sscanf(buf, VFMT "," VFMT "," VFMT " %n",
name, age_array, occupation, &n) && buf[n] == '\0')
{
// Suspect OP really wants this width to be 1 more
if (fprintf(output_fp, "%-30s%-30s%-30s\n", name, age_array, occupation) < 0)
break;
} else
break; // format error
}
fclose(input_fp);
fclose(output_fp);
}
Вместо вызова ferror () проверьте возвращаемые значения fgets (), fprintf ().
Подозреваемые необъявленные буферы поля OP были [30] и настроены scanf () соответственно.
Подробная информация о if (3 == sscanf(buf, VFMT "," ...
Значение if (3 == sscanf(...) && buf[n] == '\0') {
становится истинным, когда:
1) ровно 3 "%29[^ ,\n\t]"
спецификатора формата каждого сканирования, по крайней мере, в 1 символе.
2) buf [n] - конец строки. n устанавливается через спецификатор "% n". Предыдущее '' в "% n" вызывает любые последующие пробелы после использования последнего "%29[^ ,\n\t]"
. scanf () видит «% n», который указывает ему установить текущее смещение от начала сканирования, которое будет присвоено int, на которое указывает & n.
"VFMT "," VFMT "," VFMT " %n"
объединяется компилятором в
" %29[^ ,\n\t], %29[^ ,\n\t], %29[^ ,\n\t] %n".
Я считаю, что первое легче поддерживать, чем второе.
Первый пробел в " %29[^ ,\n\t]"
указывает sscanf () сканировать (использовать и не сохранять) 0 или более пробелов ('', '\ t', '\ n' и т. Д.). Остальное указывает sscanf () использовать и сохранять любые символы от 1 до 29, кроме ',', '\ n', '\ t', а затем добавить '\ 0'.