2

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。
有什么建议吗?有没有人告诉我在哪里提交错误?

4

1 回答 1

3

比 libstdc++ 中的错误(可能会出现,以及 gcc 中的错误,但现在很少见),输入文件中的行终止不正确 - 可能它使用的是 DOS/WindowsCR+LF行结尾,这 - 作为getline()丢弃 LF - 导致第二个字符串覆盖第一个字符串。如果您通过某种十六进制转储程序运行程序的输出,您可以很容易地看到这一点,例如xxd.

\r在您阅读的字符串的末尾检查(顺便说一句,MacOS 到版本 9 仅将其用作 EOL 标记),修复您的输入,或在打印时适当地在输出中添加换行符。

于 2012-11-11T23:55:46.830 回答