C ++ getline 在 Windows 中读取整个文件

c++ getline reads entire file in Windows

本文关键字:读取 文件 Windows getline      更新时间:2023-10-16

这看起来像是一个与此类似的问题,但我认为我的情况实际上可能有点不同。代码如下:

void readOmronResults(string fileName)
{
ifstream inFile(fileName);
ofstream testRead("test_read.txt");
string line;
//getline(inFile, line);
//cout << line << endl;
while (getline(inFile, line))
{
testRead << line << endl;
}

inFile.close();
testRead.close();
cout << "Finished reading omron results" << endl;
}

testRead 仅用于调试。输入文件是一个.csv文件,如下所示:

IMAGE,RIGHT_EYE_IN_X,RIGHT_EYE_IN_Y,RIGHT_EYE_OUT_X,RIGHT_EYE_OUT_Y,LEFT_EYE_IN_X,LEFT_EYE_IN_Y,LEFT_EYE_OUT_X,LEFT_EYE_OUT_Y
0001_2m_-15P_-10V_-10H,2386,1627,2171,1613,2754,1623,3009,1583
0001_2m_-15P_-10V_-15H,2377,1620,2171,1606,2750,1611,3003,1574
0001_2m_-15P_-10V_-5H,2376,1614,2166,1599,2752,1609,3012,1577
...

如果我运行上面的代码,test_read.txt中的输出与输入文件中的输出完全相同。但是,如果我恢复两个注释掉的行,控制台窗口将显示输入文件中的所有行(从第二行重复),并且test_read.txt为空。从链接的帖子中,我想这可能与不同操作系统中行尾的差异有关。我的操作系统是Windows,根据我的文本编辑器,原始输入文件是Mac-OS风格。但如果正因为如此,为什么原始代码(注释掉了两行)能够给出正确的结果?

我的IDE是Visual Studio 2012,我的机器是64位的。

我的操作系统是Windows,根据我的文本编辑器,原始输入文件是Mac-OS风格。

是的,这就是问题所在。Windows 的 C 和 C++ 标准库将假定文本文件使用 Windows 行结尾,U+0D U+0A

"Mac OS风格"对于文本编辑器来说是一个奇怪的事情,因为另一行以通用U+0A结尾,这是整个Unix家族(包括Linux)所共有的。很久以前,Mac OS使用了U+0D这使得"Mac OS风格"一词模棱两可且不合时宜。

但如果正因为如此,为什么原始代码(注释掉了两行)能够给出正确的结果?

它没有。该程序的两个版本都将文件视为包含一行很长的行。

如果它们是 Mac OS 结尾'r',根据文档: http://www.cplusplus.com/reference/string/string/getline/这种行为并不奇怪。

释义文档:当不给出分隔符时,getline将准备就绪,直到遇到换行符('n')字符。