如何忽略字符并只读取c文件中的整数

时间:2012-03-23 08:27:49

标签: c

我有一个文件并使用fscanf我想只读取整数并忽略字符(如果有的话)。

就像文件一样:

1 2 一个 五 C 6

(即在每一行上只有一个数字或字符......我想忽略有字符的行) 所以我只需要读取整数值。

有人知道怎么做吗?

感谢。

4 个答案:

答案 0 :(得分:1)

您是否尝试过正则表达式。

在阅读时,请使用正则表达式过滤器进行检查,然后使用条件语句。如果满足正则表达式(即输入是整数)。然后完成阅读过程,否则转到下一个输入。

答案 1 :(得分:1)

这些数字都是一位数吗?在这种情况下,您可以使用getc逐个字符地读取,使用isdigit查看它是否为数字,如果是,则处理它。

这些数字可以有多个数字吗?在这种情况下,你可以使用类似的东西,但是当你到达一个数字时,用ungetc将它放回到流中,并用fscanf(...,“%d”,......)读取数字。 / p>

我知道通常的建议是逐行读取fgets,然后解析该行的数据,我同意直接来自用户的输入这可能是最好的方法。但是对于阅读这样的文件,我认为它是过度的,而且可以使用更简单的解决方案。

答案 2 :(得分:0)

您可以使用isnum检查单个字符串,或只调用strtol / atoi并检查errno是否设置为EINVAL。

http://linux.die.net/man/3/strtol

答案 3 :(得分:0)

我的想法是继续使用char-by-char来查找每个整数。用负标记处理负数(以' - '开头)。

//pseudo-code
int negative = 0;
int curdigit = 0;
char c = '\0';
while((c = getchar())) //pseudo-function, get the next character from the stream (i.e fgetc)
{
    if (c >= '0' && c <= '9')
    {
        curdigit = (c - '0');
        if (negative)
            curdigit *= -1; //can just do this bitwise, but im lazy.
        //do something with the current digit.
        negative = 0; //negative cannot persist for more than 1 iteration.
    }
    else if (c == '-')
    {
        negative = 1;
    }   
    else { negative = 0; }
}