Отрицается набор в fscanf и ВФ


В моем файле есть список строк, разделенных запятыми:

Имя 1, Имя 2, Имя 3,

Я хочу прочитать эти имена, пропустив все запятые. Я написал следующий цикл:
while(true)
{
    if(fscanf(file, "%[^,],", my_string) != 1)
    {
        break;
    }

    //...
}
Однако он всегда выполняется один раз больше, чем предполагалось. Учитывая 3 имени в файле, цикл будет выполнять свои операторы 4 раза. Почему это происходит? Разве показатель ВФ ранг, чтобы мое отрицается набор [^,]? Если да, то как я могу решить эту проблему?
2 2

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
    }

Если нет, пожалуйста, опубликуйте более подробный код и ваш тестовый файл