在 C++ 中,get() 和 getline() 对换行符的处理方式不同


ifstream fin;
ofstream fout;
char ch;
string st;
fin.open("testfile.txt");
fout.open("testfile.txt");
while(!fin.eof())
{
   fin.get(ch);
    cout << ch;
}
fin.clear();
fin.seekg(ios::beg);
while(!fin.eof())
{
   getline(fin, st);
    cout << st;
}

测试文件包含以下内容:

abcd  efg
1234  hij

结果:

abcd efg
1234 hijabcd  efg1234  hij

我要问的是:

为什么使用 fin.get(ch) 和 Getline(Fin, ST)?

get()返回每个字符。 getline()扔掉了行终止符。

因为你的while(!fin.eof())被破坏了(请参阅我在问题下的评论),当你实际上在文件末尾时,你尝试另一个输入操作,然后 EOF 在流上设置,但直到你尝试输入的变量被使用才被选中。

这就是为什么您在最后一行打印两次st

1234 hijabcd  efg1234  hij

getline()确实从 st 中设置的值中删除了(换行符)分隔符,这就是为什么您的所有输出都出现在同一行上的原因。

对于get版本,在EOF尝试读取将返回您打印的Traits::eof()...可能会也可能不会明显显示某些内容,具体取决于您的实现选择的eof()值和您的终端/控制台程序。

最新更新