没有得到预期的结果 - 字符串连接

时间:2012-03-10 20:28:08

标签: c++ g++ linuxmint

我编写(复制并修改)了一个代码,目的是将所有行连接成文件中的单个字符串。但是我得到了意想不到的结果。

//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++) {

出了什么问题?

4 个答案:

答案 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.cpptype 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