Не получен ожидаемый результат - конкатенация строк - PullRequest
1 голос
/ 11 марта 2012

Я написал (скопировал и изменил) код с целью объединить все строки в одну строку в файле.Однако я получаю неожиданный результат.

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

3 голосов
/ 11 марта 2012

Похоже, ваш endl персонаж просто CR без следующих LF. Это означает, что каждый дополнительный вывод строки выводится поверх предыдущей строки, поэтому вы увидите последний символ, отображаемый в каждом столбце.


После более внимательного изучения проблема в строке

finalString += v[i];

, который должен быть

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

В противном случае вы объединяете строки, заканчивающиеся символами CR (возврат каретки), но без символов LF (перевод строки или новая строка).

2 голосов
/ 11 марта 2012

Хм .. у меня работает (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.

1 голос
/ 11 марта 2012

Проблема в том, что getline() содержит завершающий символ новой строки , который вы хотите удалить или заменить пробелом.См. Я получаю сдвиг строки при попытке построить строку для ответа на аналогичный вопрос.

1 голос
/ 11 марта 2012

Ваш код не имеет проблем.

$ 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 .

...