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位)。然后打印出来。根据终端使用的代码页,它可以是字符、不间断空格或其他东西。有可能,您打印了不间断的空格字符,或者其他不可见或不可打印的字符。