【问题标题】:Using the return value of "scanf()" to check for end of file使用“scanf()”的返回值来检查文件是否结束
【发布时间】:2013-04-19 07:13:19
【问题描述】:

我正在网上搜索如何使用scanf的返回值来检查文件的结尾! 我找到了以下代码。但是我很难理解?

这个方法是如何工作的?

'~' 操作符是什么意思?

while(~scanf("%d",&n)) { 
  /* Your solution */
}

【问题讨论】:

  • 我们不应该使用fscanf() 来读取文件吗?scanf() 专门从stdin 读取数据嗯?

标签: c file scanf


【解决方案1】:

这是一种检查值是否不同于 -1 的可怕方法。 ~x 返回 x 的按位否定。因此,请记住用于负数的免费代码(顺便说一下,在大多数编译器上,这种方法甚至不是很便携)-1 由 1-s 的序列表示,因此 ~(-1)将产生一个零。

请不要使用这种方法。只需写scanf("%d", &n) != EOF 方式更容易理解。

【讨论】:

  • 是的,便携方式是scanf("%d", &n) != EOF,-1 is value of EOF on most platform
  • @GrijeshChauhan 谢谢!这是完全正确的。将编辑我的答案。
  • @IvayloStrandjev 与scanf() 相比,fscanf() 不应该是从文件中读取的正确选择吗?我们可以使用scanf() 从stdin 以外的任何地方读取吗?跨度>
  • @SheerFish 理论上你可以使用freopen 来重定向标准输入,但是是的,scanf 从stdin 读取。问题是如何根据我的理解检查标准输入中的 EOF(请参阅问题中的代码)。
  • @IvayloStrandjev 我永远不会将该问题中的代码用于 EOF!
【解决方案2】:

~ 是按位非运算符。因此,这是一种稍微模糊的循环方式,直到 scanf 返回 -1 以外的值。换句话说,

while(~scanf("%d",&n))

等价于

while(scanf("%d",&n) != -1)

【讨论】:

    【解决方案3】:

    在 C 中,~ 是一个执行按位移位运算的运算符,它创建原始数字的补码。 在 C 中没有布尔类型,0 是假的,其他一切都是真的,在你的例子中:

    while(~scanf("%d",&n)) { 
      /* Your solution */
    }
    

    scanf() 如果没有更多字符要读取,则返回 EOF,它等于 -1(并非在所有平台上!)所以 -1 表示为(在 32 位架构中为 111...32 次)~EOF = 0因此,您的代码可能无法适用于所有平台。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-01
      • 1970-01-01
      • 2023-04-10
      • 1970-01-01
      • 2011-02-21
      • 2014-04-24
      相关资源
      最近更新 更多