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。
有什么建议?
有没有人告诉我在哪里提交错误?
答案 0 :(得分:2)
比libstdc ++中的错误更有可能(可能发生,也可能发生在gcc中,但现在很少见),输入文件中的行终止不正确 - 可能是使用了DOS / Windows {{1行结束,其中 - CR+LF
丢弃LF - 导致第二个字符串写在第一个字符串上。如果您通过某种十六进制转储程序运行程序的输出,例如,您可以轻松地看到这一点。 getline()
。
在您阅读的字符串末尾检查xxd
(顺便说一句,MacOS到版本9只用作EOL标记),修改输入,或者在打印时适当添加新行