0
std::fstream * file;
std::string strBuf;

file = new std::fstream;            
file -> open ( "/path/to/file" );

while ( !file -> eof() )
{ 
   getline ( *file, strBuf );
   std::cout << "PREFIX" << strBuf << "POSTFIX" << std::endl;
}

Допустим, в файле строка "some text". Результат выполнения:

POSTFIXome text

Если сделать длины префикса и постфикса одинаковыми, например так:

std::cout << "PREFIX0" << strBuf << "POSTFIX" << std::endl;

то

POSTFIXsome text

Далее в тексте программы содержание strBuf копируется в char*, при этом поведение char* абсолютно такое же. В общем, мне плевать на то, что выводит cout. В этой переменной содержится имя другого файла (музыкального), который необходимо открыть. Но не получается (Segmentation fault (core dumped)), видимо из-за такой непонятной строки из файла.

Roman
  • 31
  • 5
  • Вы свой файл посмотрите в каком нибудь редакторе показывающем его в hex виде. У вас там скорее всего содержатся управляющие символы переводящие курсор в начало строки. А скорее всего \r без \n – Mike Jan 13 '16 at 15:13
  • А PREFIX вообще не выводит? Возможно в файле есть какие-то управляющие символы. Что hexdump показывает? – dzhioev Jan 13 '16 at 15:14
  • 1
    @Roman getline на linux читает из файла до \n и при этом ее не возвращает, но если файл записан в виндовом стандарте, то там идет \r\n. В итоге вам возвращается строка, содержащая на конце \r, вам надо после чтения строки удалить из нее все \r – Mike Jan 13 '16 at 15:19
  • @Mike Посмотрел в hex. Между строками везде 0D 0A. Это о чём-то говорит? – Roman Jan 13 '16 at 15:20
  • @Mike Да, всё верно. Файл из винды. Спасибо, попробую! – Roman Jan 13 '16 at 15:22
  • 2
    @Roman, советую утилиту dos2unix – dzhioev Jan 13 '16 at 15:24
  • @Abyx Благодарю за инфу! – Roman Jan 13 '16 at 15:25
  • @dzhioev Возьму на заметку, спс – Roman Jan 13 '16 at 15:27
  • 1
    @Roman 0D это как раз \r, 0A - \n и последнюю отрезает getline. вот \r вам и мешает. – Mike Jan 13 '16 at 15:27

1 Answers1

1

Как подсказал пользователь @Mike в комментариях к вопросу, проблема в \r. Решается так:

size_t pos = 0;
while ( ( pos = file.find("\r", pos) ) != std::string::npos )
{
    file.replace(pos, 2, "");
}
Roman
  • 31
  • 5