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

c++ getline reads entire file in Windows

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

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中的输出与输入文件中的完全一样。但是,如果我恢复两条注释掉的行,控制台 window 会显示输入文件中的所有行(从第二行开始重复)并且 test_read.txt 为空。从链接 post 我猜想这可能与不同操作系统中行尾的差异有关。我的操作系统是 Windows,根据我的文本编辑器,原始输入文件是 Mac-OS 样式。但如果是因为这个,为什么原来的代码(注释掉的那两行)能够给出正确的结果呢?

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

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

释义文档:当不提供定界符时,getline 将准备就绪,直到遇到换行符 ('\n')。

My operating system is Windows and according to my text editor the original input file is Mac-OS style.

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

"Mac OS style" 对于文本编辑器来说是一个奇怪的事情,因为另一行以常用 U+0A 结尾,这对包括 Linux 在内的整个 Unix 系列都是通用的。很久以前,Mac OS 使用 U+0D 这使得短语 "Mac OS style" 模棱两可且不合时宜。

But if it is because of this, why is the original code (with the two lines commented out) able to give a correct result?

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