【问题标题】:c++ getline reads entire file in Windowsc ++ getline在Windows中读取整个文件
【发布时间】:2015-05-03 04:43:51
【问题描述】:

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

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

【问题讨论】:

    标签: c++ getline


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 你说的完全正确!原始代码没有给出正确答案。编辑器会根据 Mac OS 中使用的内容自动转换行尾,我认为它是由多个 getline 调用生成的。谢谢!
    • @eaglesky 您的编辑器实际上将文件转换为使用回车结尾?病态的。这叫什么?我已经看到 Eclipse 在某些情况下会这样做。
    【解决方案2】:

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

    解释文档:如果不提供分隔符,getline 将准备就绪,直到遇到换行符 ('\n')。

    【讨论】:

    • OS X 使用 '\n',与其他 unix 相同。 '\r' 行尾适用于经典的 Mac OS。
    • 呃。请不要使用 cplusplus.com,他们的事实核查很糟糕。 OS X 不使用\r a.k.a. ASCII 回车 U+0D,即使使用了,该平台上的符合标准的 C 编译器也需要将该值称为 \n。反斜杠序列是引用二进制字节的一种令人困惑的方式,不适合像 cplusplus.com 这样的跨平台网站。
    • @bames53 @Potatoswatter 为什么他在 windows 上的编辑会声称 OSX 结尾?很明显,如果它们是 \n,它会声明 unix 结尾?
    • 此外,\n\r 被很好地指定为不同的值,即使在 \r 是行尾的平台上也是如此。
    • @AnthonySottile 查看我的回答。编辑说这话很奇怪,我怀疑 OP 没有给出准确的报价。然而,考虑到 Classic Mac OS 已经过时了多长时间(想想 Windows Me),这样的文件绝对不常见
    猜你喜欢
    • 2023-03-04
    • 2016-07-29
    • 2013-02-14
    • 1970-01-01
    • 2016-07-15
    • 2013-12-22
    • 2012-10-02
    • 2012-06-17
    • 1970-01-01
    相关资源
    最近更新 更多