【问题标题】:`fin.get(ch);` reads last character twice while `ch=fin.get();` not inside `while(!fin.eof())` loop why? [duplicate]`fin.get(ch);` 读取最后一个字符两次,而 `ch=fin.get();` 不在 `while(!fin.eof())` 循环中,为什​​么? [复制]
【发布时间】:2021-10-27 13:33:50
【问题描述】:

vicky.txt 文件

I was born in Hupari.

代码-1

#include <iostream>
#include<fstream>
int main()
{
    char ch;
    std::ifstream fin;
    fin.open("vicky.txt", std::ios::in);

    while (!fin.eof())
    {
        fin.get(ch);
        std::cout<<ch;
    }
    fin.close();
    return 0;
}

输出

I was born in Hupari..

代码-2

#include <iostream>
#include<fstream>
int main()
{
    char ch;
    std::ifstream fin;
    fin.open("vicky.txt", std::ios::in);

    while (!fin.eof())
    {
        ch=fin.get();
        std::cout<<ch;
    }
    fin.close();
    return 0;
}

输出

I was born in Hupari. 

为什么在使用fin.get(ch) 时它会读取最后一个字符两次。另一方面,ch=fin.get() 正确读取意味着只读取最后一个字符一次。

顺便说一下fin.get(ch)的返回类型? fin.get() 的返回类型是 char 对吗?

【问题讨论】:

标签: c++ get file-handling ifstream eof


【解决方案1】:

两个版本都是错误的。有关如何正确编码读取循环的更多详细信息,请参阅Why is iostream::eof inside a loop condition (i.e. while (!stream.eof())) considered wrong?


现在,解释发生了什么。第一个版本使用get() 的第二个重载。如果读取失败(例如到达文件末尾)并设置标志,此方法将保持其参数不变。因此,您再次打印最后读取的字符。

第二个版本使用get() 的第一个重载。因为这个版本必须返回一个字符并且不能像其他版本一样让它保持不变,所以它返回一个int,以便能够返回特殊值EOF(它不能代表任何有效字符)。 EOF 通常等于-1(如int)。然后,您将其隐式转换为char,这将使其等于255(或保持为-1,但为8 位)。然后你打印它。根据终端使用的代码页,它可能是 ÿ char、不间断空格或其他内容。可能您打印了不间断的空格字符,或其他一些不可见或不可打印的字符。

【讨论】:

  • fin.get(ch) 的返回类型是什么?
  • @AbhishekMane 返回值为fin,即您调用该方法的同一流。这允许您链接调用。例如,像这样的链 - fin.get(ch).eof() 将让您在读取后检查 eof 值。或者,更好的版本,if(fin.get(ch)) 只有在读取成功时才会运行。
猜你喜欢
  • 1970-01-01
  • 2020-05-17
  • 1970-01-01
  • 1970-01-01
  • 2012-10-31
  • 2021-07-25
  • 2017-02-17
  • 2019-05-16
  • 1970-01-01
相关资源
最近更新 更多