fgets и sscanf

Этот код должен получать целые числа из файла, который является finput, и сортировать его, и получает первое целое число в файле, которое представляет собой количество целых чисел для сортировки, а целые числа, которые следуют, являются целыми числами для сортировки. Я не понимаю, как fgets и sscanf работают вместе. Может кто-нибудь объяснить, как fgets и sscanf работают в этом коде?

FILE *finput;
int *array_int, c1, no_elem;
char numlines[500];

fgets(numlines, 500, finput); 
array_int = (int *)malloc(sizeof(int)*no_elem);
if ((sscanf(numlines, "%d", &no_elem) == 1) &&  array_int!= NULL)
{
    for(c1=0; fgets(numlines, 500, finput) != NULL; )  
    {
        if (sscanf(numlines, "%d", &array_int[c1])==1) 
        {
            ++c1;
        }
    }
}

person John    schedule 25.03.2012    source источник


Ответы (1)


fgets получает строку (то есть строку текста) из файла.

sscanf анализирует строку на основе строки формата. Это обратно к sprintf. функции <x>printf и соответствующие функции <x>scanf позволяют форматировать вывод и ввод соответственно со строкой стандартного формата. Например, "%d" означает "целочисленное значение со знаком", а в контексте <x>scanf это означает "прочитать его в следующий параметр в следующем списке параметров" (ваш элемент массива в вашем случае).

Вы можете выполнять синтаксический анализ непосредственно из файла, используя fscanf, но вместо этого использование fgets + sscanf обеспечивает большую гибкость и может быть более безопасным.

person littleadv    schedule 25.03.2012
comment
Не могли бы вы добавить пример того, почему fscanf может быть небезопасным? - person galymzhan; 25.03.2012
comment
@galymzhan ничего не приходит в голову. Почему? - person littleadv; 25.03.2012
comment
Значит, fgets получает целое число, а sscanf присваивает это целое число массиву array_int? Я прав? Почему в sscanf есть == 1? - person John; 25.03.2012
comment
@Джон, ты прочитал первое предложение в моем ответе? Как вы пришли к такому выводу? Вы читаете текстовую строку, а затем анализируете текстовую строку. Это два разных и не связанных между собой действия. Есть функция, которая делает их одновременно, или вы можете делать их по отдельности. - person littleadv; 25.03.2012
comment
@littleadv Просто любопытно, большую часть времени я использую fscanf напрямую. - person galymzhan; 25.03.2012
comment
@littleadv Я имею в виду свой код. Я спрашиваю, что функция fgets в коде fgets(numlines, 500, finput) получает строку, содержащую целые числа. И функция sscanf numlines, %d, &array_int[c1] получает строку, которая является числом, и извлекает это значение, а array_int получит это значение как целое число. Это правильно? - person John; 25.03.2012
comment
@Джон Думаю, да... Я не уверен, что следил за тобой, но, похоже, ты следил за мной. fgets читает строку из файла. Ему все равно, что в нем, если его меньше 500 символов. sscanf читает целое число из строки. Ему неважно, что в нем содержится, он будет игнорировать все до тех пор, пока не сможет разобрать число, а затем проигнорирует все остальное. Если в итоге он проигнорировал всю строку - он вернет 0, чтобы отметить, что он не нашел там число. - person littleadv; 25.03.2012
comment
О, я вижу, значит, sscanf будет возвращать 1, пока находит строку в numlines? Большое спасибо! :D - person John; 25.03.2012