2013-11-25 66 views
0

我正在嘗試解決關於spoj的問題。顯然輸入行按照註釋結尾爲\r\n。我從以前的問題中得知關於\r\n的是它的一個窗口事物。我想知道的是如何考慮它。目前我在C++中使用getline(cin,str)。我該怎麼做才能考慮到\r\n.考慮到 r n

+4

您想如何「考慮它們」? – lurker

+0

@mbratch在如何擺脫它,並存儲在一個字符串對象的行 – ishan3243

回答

4

當您使用std::getline(std::cin, str)'\n'已經照顧:直到它找到一個'\n'並插入到這些strstd::getline()將讀取字符。但是,它不插入'\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