Отрицается набор в fscanf и ВФ
В моем файле есть список строк, разделенных запятыми:
Имя 1, Имя 2, Имя 3,
Я хочу прочитать эти имена, пропустив все запятые. Я написал следующий цикл:while(true)
{
if(fscanf(file, "%[^,],", my_string) != 1)
{
break;
}
//...
}
Однако он всегда выполняется один раз больше, чем предполагалось. Учитывая 3 имени в файле, цикл будет выполнять свои операторы 4 раза. Почему это происходит? Разве показатель ВФ ранг, чтобы мое отрицается набор [^,]? Если да, то как я могу решить эту проблему?2 ответа:
Я почти уверен, что это делает именно то, что вы хотите. Единственное изменение в алгоритме, которое я сделал, - это добавил ведущий пробел-clear перед
%
в строке формата. Кроме того, я изменил это, чтобы открыть файл из командной строки arg. Так легче проверить. Надеюсь, все в порядке.#include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { if (argc != 2) return EXIT_FAILURE; FILE *fp = fopen(argv[1], "r"); if (NULL == fp) return EXIT_FAILURE; char str[100]; int count=0; while (1) { if(fscanf(fp, " %[^,],", str) != 1) break; printf("%s\n", str); ++count; } printf("Parsed %d strings.", count); return EXIT_SUCCESS; }
Вывод
Name 1 Name 2 Name 3 Parsed 3 strings.
Я полагаю, что "четвертое" выполнение в цикле, который вы видите, - это условие сбоя, которое разрывает цикл из-за сбоя синтаксического анализа, если я не пропущу что-то или непонимание того, что вы наблюдаете.
Почему ваши операторы цикла выполняются 4 раза. Цикл прерывается после 4-го оператора fscanf, и нижеприведенные коды не выполняются.Индикатор EOF не относится к вашему отрицательному набору, однако, возможно, вы ищете более компактное решение, как это:
while(fscanf(file, "%[^,],", my_string)!=EOF ) { //do something }
Если нет, пожалуйста, опубликуйте более подробный код и ваш тестовый файл