有没有简单的方法从文件中读取未验证的十进制值?

时间:2012-11-05 14:52:08

标签: c validation file-io scanf

假设我有一个十进制数字文件,其中应该是适合int的值,但我想以编程方式验证此文件的内容以检查溢出。有没有一种简单的方法可以检查是否有任何数字会超过整数?

实施例。档案 -

name:  test.txt
value: 4343214321423142314

如果我要循环并执行fscanf(fd, "%d", &myint),我们将返回成功的指示,但存储在myint中的数字将是不正确的。

同样,如果我将其读入字符数组fscanf(fd, "%s", &mystr)并盲目地调用atoi(mystr),它将返回成功,但结果不正确。

考虑到将其读入字符串的第二个例子,可以执行以下操作:

char buf[11] = {'\0'};
sprintf(buf, "%d", INT_MAX);

fscanf(fd, "%s", &mystr); 
if(strcmp(mystr, buf) > 0)
    // handle error case

但是有没有更简单的方法来执行此操作而无需额外的数组和字符串比较功能?

4 个答案:

答案 0 :(得分:2)

也许您可以将整数读入字符串,然后使用strtol。然后根据结果的类型有两个解决方案:

  • long:如果它返回LONG_MINLONG_MAX,您可以针对值errno检查ERANGE以查看该数字是否溢出;
  • int:如果它返回的数字大于INT_MIN或小于INT_MAX,您可以安全地将您的号码放在int变量中。

答案 1 :(得分:2)

为什么不使用

fscanf(fd, "%d%n%c", &myInt, &pos, &nextChar);

然后检查pos是否符合预期,下一个字符不是数字?

答案 2 :(得分:1)

是的,使用strtol();如果转换由于溢出而失败,则它具有明确定义的行为。如果您知道传入的值实际上是未签名的,请使用strtoul()

答案 3 :(得分:1)

根据scanf(3)手册页,如果errno设置为

,转换将失败
  

ERANGE

     

整数转换的结果将超过可以存储在相应整数类型中的大小。

在你的情况下。因此,我只需检查scanffscanf的结果并使用errno