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? Прав ли съм? Защо има ==1 в sscanf? - person John; 25.03.2012
comment
@John, прочете ли първото изречение в отговора ми? Как стигнахте до това заключение? Вие четете текстов низ и след това анализирате текстовия низ. Това са две, различни и несвързани действия. Има функция, която ги прави и двете едновременно, или можете да ги правите поотделно. - 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
@John, така мисля... Не съм сигурен, че те последвах, но изглежда, че ти ме последва. fgets чете низа от файла. Не го интересува какво има в него, стига да е под 500 знака. sscanf чете int от низа. Той се интересува какво има в него, ще игнорира всичко, докато не може да анализира число, и след това ще игнорира всичко останало. Ако в крайна сметка игнорира целия низ - ще върне 0, за да ви отбележи, че не е намерил число там. - person littleadv; 25.03.2012
comment
О, разбирам, така че sscanf ще върне 1, стига да намери низ в numlines? Благодаря ти много! :Д - person John; 25.03.2012