2013-11-25 4 views
0

Я пытаюсь решить проблему на spoj. По-видимому, входные строки заканчиваются \r\n в соответствии с комментариями. То, что я знаю о \r\n из предыдущих вопросов, - это то, что у него есть дело с окнами. Я хочу знать, как это учитывать. В настоящее время я использую getline(cin,str) в C++. Что нужно сделать, чтобы принять во внимание \r\n.Принимая во внимание r n

+4

Как бы вы хотели «принять их во внимание»? – lurker

+0

@mbratch как в том, как избавиться от него и сохранить строку в строковом объекте – ishan3243

ответ

4

При использовании std::getline(std::cin, str)'\n' уже позаботилась о: std::getline() будет читать символы до тех пор, пока не найдет '\n' и вставляет их в str. Однако он не вставляет '\n'.

Таким образом, вы можете застрять с '\r' в конце строки. Если вы находитесь в Windows, вы можете просто открыть свой файл в текстовом режиме, и поток также извлечет их. Если это не путь, вы можете просто определить, если ваш str заканчивается '\r' и удалить его:

if (!str.empty() && str[str.size() - 1] == '\r') { 
    str.erase(str.end() - 1); 
} 

Если вы хотите, чтобы удалить все символы возврата каретки (может, в теории, вложенные в строке), вы можете использовать

str.erase(std::remove(str.begin(), str.end(), '\r'), str.end()); 

Наконец, если вы не хотите, чтобы когда-либо столкнуться с возврата каретки, вы можете создать поток буфера фильтрации, которая просто удаляет все '\r' (или только те из "\r\n" последовательности). Ниже приведен краткий пример того, как можно реализовать простой буфер потока фильтрации:

#include <algorithm> 
#include <iostream> 
#include <streambuf> 
#include <string> 

class crfilter 
    : std::streambuf 
{ 
    std::istream* stream; 
    std::streambuf* sbuf; 
    char buffer[8]; 
    int underflow() { 
     std::streamsize n; 
     while (this->gptr() == this->egptr() 
      && (n = this->sbuf->sgetn(buffer, 8))) { 
      char* end = std::remove(buffer, buffer + n, '\r'); 
      this->setg(buffer, buffer, end); 
     } 
     return this->gptr() == this->egptr() 
      ? std::char_traits<char>::eof() 
      : std::char_traits<char>::to_int_type(*this->gptr()); 
    } 
public: 
    crfilter(std::istream& in): stream(&in), sbuf(in.rdbuf(this)) {} 
    ~crfilter() { stream->rdbuf(this->sbuf); } 
}; 

int main() 
{ 
    crfilter filter(std::cin); 
    std::string str; 
    while (std::getline(std::cin, str)) { 
     std::cout << "str='" << str << "'\n"; 
    } 
} 
0

Это каретки возврата/строки, которые сообщают вам о конце строки и начале следующего.

+1

Я уверен, что OP уже это знает. Я думаю, что его вопрос больше связан с тем, как вырезать их/добавить их обратно во время чтения/записи файла. – Praetorian

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