2013-11-25 68 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