这是g ++ 4.7.2中的cout和getline的错误吗?

时间:2012-11-11 23:18:48

标签: ubuntu g++ cout getline

2012/11/13更新: 我发现我的问题已被提出。 这是处理不同行结束文本文件的好方法: Getting std :: ifstream to handle LF, CR, and CRLF?

是否可以为libstdc ++做出贡献?怎么样?


2012年11月11日

我发现cout有问题。
如果从getline()返回两个字符串,
第二个字符串将覆盖输出中的第一个字符串。

这是示例代码:

#include<iostream>
#include<fstream>
using namespace std;

int main()
{
    //normal code
    cout << "Normal result:" << endl;
    string str1 = "hello";
    cout << str1;
    str1 = "123";
    cout << str1;

    cout << endl;

    //broken code
    cout << "Bug?" << endl;
    ifstream fin;
    fin.open("test.dat");

    string str;

    getline(fin, str);
    cout << str;

    getline(fin, str);
    cout << str;

    fin.close();
    return 0;
}

这是输入文件(test.dat):

hello
123

输出将是:

Normal result:
hello123
Bug?
123lo

我正在使用ubuntu 12.10 64位,
而编译器的版本是 g ++(Ubuntu / Linaro 4.7.2-2ubuntu1)4.7.2。
有什么建议? 有没有人告诉我在哪里提交错误?

1 个答案:

答案 0 :(得分:2)

比libstdc ++中的错误更有可能(可能发生,也可能发生在gcc中,但现在很少见),输入文件中的行终止不正确 - 可能是使用了DOS / Windows {{1行结束,其中 - CR+LF丢弃LF - 导致第二个字符串写在第一个字符串上。如果您通过某种十六进制转储程序运行程序的输出,例如,您可以轻松地看到这一点。 getline()

在您阅读的字符串末尾检查xxd(顺便说一句,MacOS到版本9只用作EOL标记),修改输入,或者在打印时适当添加新行