【问题标题】:How to ignore characters and read only integers in a c file如何忽略字符并只读c文件中的整数
【发布时间】:2012-04-07 19:48:35
【问题描述】:

我有一个文件并使用 fscanf 我只想读取整数并忽略任何字符。

就像文件是这样的:

1 2 一种 5 C 6

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

有人知道怎么做吗?

谢谢。

【问题讨论】:

  • 阅读每一行。标记化。尝试解析。跳过错误。 strtol() 的完整界面应该让您一次完成所有这些操作。
  • 到目前为止你有什么?它在哪里失败?你有错误吗?另外,第一个值应该变成 1 还是 12?
  • 这里有一个提示:scanf 说明符 "%*[^0123456789]" 将读取所有不是数字的字符并将它们丢弃。但正如其他答案所表明的那样,scanf() 家族可能不是解决此问题的最佳方法 - 特别是如果您需要能够读取负数并处理与数字不正确关联的 '-' 字符。
  • 这是我正在做的文件 *fp; fp = fopen (argv[2], "r"); if (fp==NULL) { puts ("\n 无法读取文件");返回0; } 计数 =0; int no_frames,温度,我;大小=argv[1]; fscanf(fp, "%d", &temp); while (!feof(fp)) { pages[count++]=temp; //fscanf(fp,"%d", &temp); fscanf(fp, "%d", &temp); } fclose(fp);大小=atoi(argv[1]);先进先出(); LRU();这个怎么实现?

标签: c


【解决方案1】:

你试过正则表达式吗?

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

【讨论】:

  • 一个用于相当简单的字符串处理的正则表达式库会有点矫枉过正,尤其是在它不是原生库的 C 语言中。
  • 没想到。仍然比编写像@Jason Lark 下面写的完整函数更简单,更防错。如果一个人在 c 中使用 IO,他应该能够学习一个像这个要求一样简单的正则表达式操作。
  • 读取字符串,标记它,然后尝试将每个项目解析为整数会更容易和更快。正则表达式对此方式过分。它会产生一个更慢、更大的应用程序,而且会无缘无故地变得更复杂。
【解决方案2】:

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

数字可以多于一位吗?在这种情况下,你可以使用类似的东西,但是当你得到一个数字时,用 ungetc 把它放回流中,然后用 fscanf(..., "%d", ....) 读取数字。

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • scanf("%d%*c",&n); 将读取整数,然后将其存储在 n 中,但会跳过字符。
    • fgets(); 读入缓冲区,然后使用 sscanf(); 更安全。
    【解决方案4】:

    我的想法是逐个字符地查找每个整数。处理带有负标志的负数(以“-”开头)。

    //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; }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-04
      • 1970-01-01
      • 1970-01-01
      • 2019-06-05
      • 1970-01-01
      • 1970-01-01
      • 2012-10-29
      相关资源
      最近更新 更多