1

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

//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

4 回答 4

3

看起来你的endl角色只是一个CR没有追随者的人LF。这意味着每个额外的 line out 输出都会覆盖前一行,因此您将看到每列中显示的最后一个字符。


仔细一看,问题出在了线上

finalString += v[i];

应该是

finalString += v[i] + "\n";

否则,您将连接以CR(回车)字符结尾但没有LF(换行或换行)字符的字符串。

于 2012-03-10T20:42:19.420 回答
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.cppor非常相似type fillvector.cpp

于 2012-03-10T20:36:04.740 回答
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

于 2012-03-10T20:40:59.927 回答
1

问题在于它getline() 包括终止换行符,您想将其删除或替换为空格。请参阅我在尝试为类似问题的答案构建字符串时得到换行符。

于 2012-03-11T14:27:56.367 回答