C++ getline 和 append
C++ getline and append
我正在尝试编写一个非常简单的程序,逐行读取其标准输入(直到 "end" 出现在一行的开头)。同时,它尝试构造一个包含所有行的串联的新字符串。
这种行为令人费解。这些行被正确读取(如 cout << current << endl
行所示)。但是,构造的字符串不是我所期望的。相反,它只包含最后一次阅读。但是,如果我将 construct.append(current)
替换为 construct.append("foo")
,它就可以正常工作。
我做错了什么?
#include <iostream>
#include <string>
#include <cassert>
using namespace std;
int main() {
string construct;
while(true) {
string current;
getline(cin, current);
assert(!cin.eof());
if (current.find("end") == 0) { break; }
cout << current << endl;
construct.append(current);
}
cout << construct << endl;
return 0;
}
编译:
g++ -o main main.cpp -Wall -std=c++0x
输入:input.txt
abcdef
ghij
end
输出:./main < input.txt
abcdef
ghij
ghijef
如果我键入输入而不是使用文件,它会按预期工作。我也用 gcc (linux) 和 clang (mac os) 得到相同的结果。
我发现了问题。我的输入文件是一个带有 CRLF 行终止符的 ascii 文件(我使用的是 mac)。 construct
变量已正确创建,但终端未正确显示。
我将我的 .txt 文件的内容复制到 Word 并删除了所有困难的 returns,这行得通,但这并不总是理想的或可能的。字符编码似乎没有影响。当我附加一个换行符和字符串时解决它的方法。
Text::Text(string file) {
ifstream in;
string line;
in.open( file.c_str() ); // because the file name is a parameter decided at runtime in my code
while(getline(in,line,'\n')){
fileContents.append(line+"\n"); // fixed by adding "\n" here
}
cout << "\n Final product:\n";
cout << fileContents;
}
我正在尝试编写一个非常简单的程序,逐行读取其标准输入(直到 "end" 出现在一行的开头)。同时,它尝试构造一个包含所有行的串联的新字符串。
这种行为令人费解。这些行被正确读取(如 cout << current << endl
行所示)。但是,构造的字符串不是我所期望的。相反,它只包含最后一次阅读。但是,如果我将 construct.append(current)
替换为 construct.append("foo")
,它就可以正常工作。
我做错了什么?
#include <iostream>
#include <string>
#include <cassert>
using namespace std;
int main() {
string construct;
while(true) {
string current;
getline(cin, current);
assert(!cin.eof());
if (current.find("end") == 0) { break; }
cout << current << endl;
construct.append(current);
}
cout << construct << endl;
return 0;
}
编译:
g++ -o main main.cpp -Wall -std=c++0x
输入:input.txt
abcdef
ghij
end
输出:./main < input.txt
abcdef
ghij
ghijef
如果我键入输入而不是使用文件,它会按预期工作。我也用 gcc (linux) 和 clang (mac os) 得到相同的结果。
我发现了问题。我的输入文件是一个带有 CRLF 行终止符的 ascii 文件(我使用的是 mac)。 construct
变量已正确创建,但终端未正确显示。
我将我的 .txt 文件的内容复制到 Word 并删除了所有困难的 returns,这行得通,但这并不总是理想的或可能的。字符编码似乎没有影响。当我附加一个换行符和字符串时解决它的方法。
Text::Text(string file) {
ifstream in;
string line;
in.open( file.c_str() ); // because the file name is a parameter decided at runtime in my code
while(getline(in,line,'\n')){
fileContents.append(line+"\n"); // fixed by adding "\n" here
}
cout << "\n Final product:\n";
cout << fileContents;
}