我编写(复制并修改)了一个代码,目的是将所有行连接成文件中的单个字符串。但是我得到了意想不到的结果。
//Fillvector.cpp
#include <string>
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
int main() {
vector<string> v;
ifstream in("Fillvector.cpp");
string line;
string finalString="";
while(getline(in, line))
v.push_back(line);
for(int i=0; i < (int)v.size(); i++) {
finalString += v[i];
}
cout << finalString << endl;
}
我在终端上获得的结果是
}nt maincout << finalString << endl;(); i++) {
出了什么问题?
答案 0 :(得分:3)
看来您的endl
字符只是CR
而没有跟随LF
。这意味着每个额外的换行输出都写在前一行上,因此您将看到的是每列中显示的最后一个字符。
仔细观察后,问题出在
行finalString += v[i];
应该是
finalString += v[i] + "\n";
否则,您将串联以CR
(回车)字符结尾的字符串,但不包含LF
(换行符或换行符)字符。
答案 1 :(得分:2)
嗯..适合我(MinGW G ++ 4.6.1,Windows):
C:\>fillvector
//Fillvector.cpp#include <string>#include <iostream>#include <fstream>#include <
vector>using namespace std;int main() {vector<string> v;ifstream in("Fillvector.
cpp");string line;string finalString;while(getline(in, line))v.push_back(line);f
or(int i=0; i < v.size(); i++) {finalString += v[i];}cout << finalString << endl
;}
C:\>
那么,您使用的编译器和操作系统是什么?
另请注意,getline
会删除换行符,因此您可能需要稍微更改代码:
[...]
while(getline(in, line)) {
v.push_back(line);
v.push_back("\n");
}
[...]
更改后,您的代码的行为与cat fillvector.cpp
或type fillvector.cpp
非常相似。
答案 2 :(得分:1)
您的代码没有问题。
$ g++ Fillvector.cpp
$ ./a.out
//Fillvector.cpp#include <string>#include <iostream>#include <fstream>#include <vector>using namespace std;int main(){ vector < string > v; ifstream in("Fillvector.cpp"); string line; string finalString; while (getline(in, line)) v.push_back(line); for (int i = 0; i < v.size(); i++) { finalString += v[i]; } cout << finalString << endl;}
$ ./a.out | wc -l
1
请参阅上面的日志。最后一行计算行数。及其 1 。
答案 3 :(得分:1)
问题在于getline()
includes the terminating newline character,您要删除或替换为空格。有关类似问题的答案,请参阅Im getting a lineshift when trying to build a string。