Читать строки из istringstream без символа '\r' в конце

У меня есть следующая функция:

void process (std::string str)
{
    std::istringstream istream(str);
    std::string line;
    std::string specialStr("; -------- Special --------------------\r"); // win
    //std::string specialStr("; -------- Special --------------------"); //linux
    while (getline(istream,line))
    {
      if (strcmp(specialStr.c_str(), line.c_str()) != 0)
      {
          continue;
      }
      else
      {
         //special processing
      }
    }
}

Я читаю строки из std::istringstream построчно, используя getline, пока не «встретлю» специальную строку, после чего я должен выполнить специальную обработку для следующих строк. Специальная строка:

; -------- Special -------------------- Когда я читаю соответствующую строку в окнах, она заканчивается на '\r' :

(; -------- Special --------------------\r) В Linux в конце не появляется '\r'. Есть ли способ последовательно читать строки, не различая, Linux это или Windows?

Спасибо


person Yakov    schedule 28.04.2013    source источник
comment
Возможно, вы открыли поток в двоичном режиме?   -  person jrok    schedule 28.04.2013
comment
std::строка ул; // является аргументом std::istringstream isaStream(str);//таким образом я открываю поток строк   -  person Yakov    schedule 28.04.2013
comment
А откуда вы берете содержимое str? (вы можете опубликовать код, вы знаете)   -  person jrok    schedule 28.04.2013
comment
Я получаю str в качестве аргумента. Я опубликую код - вы правы   -  person Yakov    schedule 28.04.2013
comment
@jrok - я обновил код, как вы просили   -  person Yakov    schedule 28.04.2013


Ответы (1)


Вы можете удалить '\r' с конца, используя этот код:

if(line[line.length() - 1] == '\r') line = line.substr(0, line.length() - 1);

Вы можете обернуть это в функцию, если хотите:

std::istream& univGetline(std::istream& stream, std::string& line)
{
    std::getline(stream, line);
    if(line[line.length() - 1] == '\r') line = line.substr(0, line.length() - 1);
    return stream;
}

Интегрировано в вашу функцию:

void process (std::string str)
{
    std::istringstream istream(str);
    std::string line;
    std::string specialStr("; -------- Special --------------------");

    while (univGetline(istream,line))
    {
      if (strcmp(specialStr.c_str(), line.c_str()) != 0)
      {
          continue;
      }
      else
      {
         //special processing
      }
    }
}
person Scintillo    schedule 28.04.2013
comment
Да - это возможно - спасибо. Но я предпочел вызвать какую-то встроенную функцию, чтобы избавиться/игнорировать '\ r' char - person Yakov; 28.04.2013