2016-03-09 3 views
0

Я хочу объединить три строки в C++.Конкатенация строк в C++ (Linux)

У меня есть вектор std::vector<std::string> my_list, где хранятся имена файлов. Я хочу, чтобы добавить расширение каталога и имени файла для каждого из имен файлов, чтобы прочитать двоичную информацию из файла, так что я это сделать так:

for (int i = 0; i < my_list.size(); i++) { 
     std::string tmp = prefix + my_list[i] + suffix; 
     std::ifstream file(tmp.c_str(), std::ifstream::binary); 
} 

где префикс IST станда :: строка префикс = "directory /" и suffix ist std :: string suffix = ".foo".

И он работает в Windows. Однако это не работает в Linux. Суффикс перезаписывает строку "tmp" -string. Это выглядит как foo/y_file_timestamp вместо out/my_file_timestamp.foo.

Что мне делать, чтобы предотвратить эту перезапись?

+2

Блеф! Можем ли мы увидеть [mcve]? – YSC

+3

код выглядит нормально. Ошибка должна быть где-то в другом месте. – bolov

ответ

7

Ошибка не в коде, который вы нам показали.

Проблема заключается в том, что ваши строки имеют недопустимые символы в них, в частности, каретка возвращается ('\r'), которые вызывают каретку, чтобы вернуться в начало строки при выводе вашего сцепленного строки в окне терминала.

Предположительно это проблема, вызванная неосторожным анализом входных данных с окончанием строки в стиле Windows. Вы должны нормализовать свои данные и обязательно разбить все варианты окончания строки во время разбора.

Всегда проверяйте содержимое своих строк на уровне символа при возникновении проблемы со строковыми операциями.

0

Спасибо @BarryTheHatchet. Я забыл упомянуть, что вектор my_list был заполнен так:

std::string LIST_WITH_DATA = "data/list.scp" 

const char* my_data = LIST_WITH_DATA.c_str(); 

std::ifstream my_file(my_data); 

std::string my_line; 

while (std::getline(my_file, my_line)) { 

    my_list.push_back(my_line); 

} 

data/list.scp выглядит следующим образом:

file1/00001-a 
file2/00001-b 
file3/00001-c 
file4/00001-d 

std::getline была моя проблема.

Решение, которое я нашел здесь: Getting std :: ifstream to handle LF, CR, and CRLF?

Смежные вопросы