Чтение десятичного числа из текстового файла с использованием fscaf c proramming

Привет, я новичок в программировании c, и у меня возникли проблемы с получением десятичного числа в текстовом файле с помощью fscanf. Он всегда дает мне 2 числа вместо одного примера: в текстовом файле есть: 2.5

но в результате это игра me 1 char type (2.) и 1 целочисленный тип (5);

как я могу получить десятичное число как int?

while((val = fscanf(stdin,"%d%c",&num ,&c)))
3 ответа

2.5 не является значением int. Вы должны сканировать и хранить его как тип с плавающей запятой, желательно удвоить:

int n;
****** d;
FILE *infile;
...
n = fscanf(infile, "%lf", &d);
if (n!=1) 
{ 
 ... handle bad input ... 
}

Затем вы можете применить к int или что угодно. Причина двойного заключается в том, что float не может точно представлять все 32-битные значения int.

Изменение: Чтобы проверить, что двойное значение является интегральным, просто сравните d == (int) d. Это будет верно тогда и только тогда, когда d точно равно целому числу.

PS: Я пропустил использование stdin в строке примера. Обычное использование scanf() для сканирования из stdin. Теперь это больше похоже на возможность ввода клавиатуры с возможностью ввода ошибок. Для этого я использую fgets() для получения строки и sscanf() для преобразования и проверки:

char input[82];
...
while (fgets(input, sizeof(input), stdin) != NULL)
{
 int value;
 char ignore;
 int n = sscanf(input, "%d %c", &value, &ignore);
 if (n != 1)
 { ... invalid input: print message & continue; }
 ... do something with value 
}


Причина, по которой вы получаете num == 2 и c == 5, состоит в том, что вы пытаетесь сначала прочитать целое число, а затем символ, теперь ваш входной буфер содержит 2,. , 5

Чтение целого числа останавливается, когда a . 'встречается и' . 'очищается от входного буфера, затем вы пытаетесь прочитать символ и, следовательно, "5" переходит в c.

Вы можете сделать что-то подобное

float tmp;
int num;
char c;
scanf("%f%c", &tmp, &c);
num = tmp; //this will truncate the decimal part

Примечание: будьте осторожны, если вы нажмете enter после прочтения символа и сразу попробуете прочитать символ снова, символ новой строки все еще находится во входном буфере и будет считан следующим символом, вам нужно будет явно очистить его


Для char лучше использовать fgetc(), чем fscanf (fin, "% c); Используйте его так:

c=fgetc(fi); or fputc(c,fout);

licensed under cc by-sa 3.0 with attribution.