оператор std :: string + = - PullRequest
       8

оператор std :: string + =

0 голосов
/ 25 января 2012

У меня плохая пара дней за странное поведение. У меня есть std :: string, в которой я использую оператор + =, чтобы добавить еще одну строку (на самом деле имя файла, добавляемого в путь). Когда я запустил программу, я обнаружил, что файл не был найден. Позже я обнаружил, что в начале строки добавлено имя файла.

std::string path("/home/me/location/");
std::string file("file.txt");
path += file;
std::cout << path.c_str();

Вывод этого файла "file.txt / location" !!! Я пробовал простую программу, которая просто добавляет две строки вместе, и это прекрасно работает, что я ожидал (gcc v 4.3). Я скопировал код с машины с Windows, я не ожидал никаких проблем, кроме новых путей к файлам, он действительно использует только STL и dirent, более того, он компилируется более или менее впервые. Я запустил dos2unix на всякий случай. Теперь я немного озадачен, но я до сих пор не скопировал код, кроме совершенно тривиального, поэтому я мог упустить что-то ослепительно очевидное.

Ответы [ 4 ]

3 голосов
/ 25 января 2012

Является ли путь к каким-либо образом присоединенным к нему «\ r», так что когда вы печатаете его в cout, он печатает «/ home / me / location /», возвращает в начало строки, а затем печатает «строку». .txt "?

Как кто-то сказал, посмотрите на переменные с помощью отладчика. (Мои инстинкты тоже для регистрации / печати, но отладчики тоже полезны)

1 голос
/ 25 января 2012

Похоже, file начинается с возврата каретки .Если это так, += все равно добавит file к path, но когда строка cout'ed, будет отображаться поведение, которое вы описываете.

1 голос
/ 25 января 2012

Вам не хватает разделителя / между именем каталога и именем файла.

В противном случае нет ничего плохого в коде, который вы разместили.

Следует иметь в виду, что ваш код изменяет переменную path. Если вы неоднократно вводите path += file для разных имен файлов, обязательно каждый раз повторяйте инициализацию path.

P.S. Невозможно, чтобы четыре строки кода, которые вы опубликовали, могли напечатать file.txt/location. Либо код, который вы опубликовали, отличается от того, что вы используете, либо вывод не тот.

0 голосов
/ 25 января 2012

Вы должны использовать std::stringstream для этого:

std::stringstream tempss;
std::string path("/home/me/location");
std::string file("file.txt");

tempss << path;
tempss << file;

std::string filepath = tempss.str();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...