' fin.get(ch); '读取最后一个字符两次而' ch=fin.get(); '不在' while(!fin.e



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,对吗?

两个版本都是错误的。参见为什么循环条件(即while (!stream.eof()))内的iostream::eof被认为是错误的?有关如何正确编写读取循环的详细信息。


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

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

最新更新