使用scanf c编程从文本文件中读取十进制数

时间:2013-09-19 01:19:53

标签: c scanf

您好我是c编程的新手,我在使用fscanf获取文本文件中的十进制数时遇到问题。它总是给我2个数字而不是1个 示例:在文本文件中有:2.5

但在结果中它游戏我1个char类型(2。)和1个整数类型(5);

如何将十进制数作为int?

while((val = fscanf(stdin,"%d%c",&num ,&c)))

3 个答案:

答案 0 :(得分:2)

2.5不是int值。您必须扫描并将其存储为浮点类型,最好是双倍:

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

然后你可以转换为int,或者其他什么。 double的原因是float不能完全表示所有32位int值。

编辑:要测试double值是否为整数,只需比较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 
}

答案 1 :(得分:1)

你得到的原因 num == 2和c == 5是因为你试图首先读取整数然后是char, 现在您的输入缓冲区包含 2 5

当一个&#39; &#39;遇到了&#39; &#39;从输入缓冲区刷新,接下来你试图读取一个字符,因此&#39; <&#39; 进入c。

你可以做这样的事情

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

注意:请注意,如果您在读取字符后按Enter键并立即尝试再次读取字符,则换行符仍然位于输入缓冲区中并将作为下一个字符读取,您必须显式刷新它

答案 2 :(得分:0)

对于char,最好使用fgetc()而不是fscanf(fin,&#34;%c); 像这样使用它:

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