2014-01-15 2 views
0

Я хочу выбрать числа с плавающей запятой из файла. То, что я думал, как решение было это:Выберите числа с плавающей запятой из файла

while ((ch= getc(fp)) != EOF) 
{ 
    if(isdigit(ch)) 
     //do some stuff 
} 

Однако потом я увидел, что при таком подходе я получаю только целые числа (но я хочу, поплавок). Так что я посмотрел, и я нашел это:

while((fscanf(fp, "%lf", &n) == 1) 
    //do some stuff 

Я также посмотрел определение fscanf() и среди прочего он говорит ..

Возвращаемое значение

В случае успеха, функция возвращает количество элементов аргумента список успешно заполнен. Этот счетчик может соответствовать ожидаемому числу элементов или быть меньше (даже нулевым) из-за соответствующего сбоя, ошибки чтения или досягаемости конца файла.

Если при чтении произошла ошибка чтения или достигнут конец файла, будет установлен правильный индикатор (feof или ferror). И если либо происходит до того, как любые данные могут быть успешно прочитаны, возвращается EOF.

Если ошибка кодирования происходит при интерпретации широких символов, функция устанавливает errno в EILSEQ.

Однако, я не понимаю while((fscanf(fp, "%lf", &n) == 1). Если fscanf() читает, что число с плавающей точкой вернется 1, в противном случае вернется что-то еще?

+0

Когда вы говорите «выберите», означает ли это, что есть больше неплавающей точки, данные в файле, который вы хотите пропустить? – unwind

+0

хорошо, когда я написал вопрос, который я так и думал, но я более внимательно прочитал упражнение, которое у меня есть, а затем решение, и, как кажется, программа просто выбирает числа, а затем результат печатается в тип float. Однако я оставил вопрос таким, какой он есть, потому что мне любопытно, как я могу это сделать (выберите только плавающие числа). – yaylitzis

ответ

2

Звонок в вашем коде возвращает 1, если он считывает и преобразует одно значение с плавающей запятой. Если у вас есть формат с просьбой о двух преобразованиях (например, "%lf %d"), он бы вернул 2 для успеха. Короче говоря, он вернет число успешно проанализированных форматов %, которые у вас есть в строке формата.

Если вход не число с плавающей точкой, то fscanf будет возвращать 0 и, следовательно, цикл завершится. Или, если есть ошибка или вы достигли конца файла, он вернет EOF, что также нарушит цикл.

+0

Я напечатал результат fscanf (во время цикла, был 1), и в случае, если я поместил символ, он вернет 0 и выйдет из цикла. Я попробовал это 'while ((fscanf (fp,"% lf% d ", & n) == 1', как вы сказали, чтобы посмотреть, вернет ли он 2, но я получил предупреждение' warning: format '% d' ожидает сопоставление 'int *' argument' – yaylitzis

+0

@ Nat95 в 'fscanf()' предоставляет некоторую переменную, чтобы удерживать значение, полученное '% d', точно так же,'% if' имеет '& n' –

+0

да, у вас есть право ~! I что это не так! – yaylitzis

Смежные вопросы