【问题标题】:Find out if you're reading int or double using fscanf使用 fscanf 查看您是在读取 int 还是 double
【发布时间】:2015-07-31 20:24:04
【问题描述】:

我有一个要使用 C 读取的文本文件。它包含以下格式的行:%d %d (%d or %lf)。 3行示例:

1 0 44
2 0 84.13
3 1 15.07

但最后一个数字可以是intdouble,任意。无论数据类型如何,如何从文本文件中读取?

【问题讨论】:

  • 检查最后一个数字是否包含点,也许
  • 为什么重要? (说真的。任何整数都可以读取为浮点值,并且 - 至少在 x86 硬件上 - 任何 int 都可以精确地表示为 double。所以没有必要避免丢失信息。不知道为什么它很重要,很难构建一个有用的答案。)
  • 如果您使用fgets 或类似的方式一次读取一行,则可以使用strtol 读取所有值的intpart 并检查更新后的*endptr == '.' 到确定该值是否实际上是一个浮点数。如果测试为真,则使用p = endptr; floatpart = strtof (p, &endptr); floatvar = (float)(intpart)+floatpart 读取(实际上,您可以以相同的方式解析每一行,并且仅在每次intpart 读取后*endptr == '.' 测试为真时才读取floatpart)。

标签: c parsing int double scanf


【解决方案1】:

因为 float 可以保存一个整数,但反之则不行。只需像浮点数一样读取数据并使用类似

的方法检查它是否为整数
if(ceilf(f) == f)
{
  i=(int)f;
}
//Here i is an integer and f is the float you read using %f

要查看有关如何检查浮点数是否为 int 的更多方法,请参阅

Checking if float is an integer

【讨论】:

  • 测试ceilf(f) == f 检查f 是否为整数,但不检查它是否可表示为int。例如,2.0E100 是一个整数。
  • 你总是可以去long,long long等,这里的问题是检查是否有小数
  • 2.0E100 有一个小数点,根据 OP,它肯定不是有效的 %d。但是您的测试会报告它是一个整数。鉴于问题的措辞,我不明白为什么您会认为这是正确的。不过,我没有发现 OP 足够清楚,无法做出准确的决定。
猜你喜欢
  • 2011-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-12
  • 2018-04-28
  • 2019-05-07
  • 1970-01-01
相关资源
最近更新 更多