代码之家  ›  专栏  ›  技术社区  ›  Evan Teran

std::stringstream如何设置失败/错误位?

  •  9
  • Evan Teran  · 技术社区  · 16 年前

    我用于简单字符串拆分的一段常见代码如下所示:

    inline std::vector<std::string> split(const std::string &s, char delim) {
        std::vector<std::string> elems;
        std::stringstream ss(s);
        std::string item;
        while(std::getline(ss, item, delim)) {
            elems.push_back(item);
        }
        return elems;
    }
    

    有人提到,这会无声地“吞咽”错误发生的过程 std::getline 在实践中 我需要担心的。基本上可以归结为:

    inline std::vector<std::string> split(const std::string &s, char delim) {
        std::vector<std::string> elems;
        std::stringstream ss(s);
        std::string item;
        while(std::getline(ss, item, delim)) {
            elems.push_back(item);
        }
    
        if(/* what error can I catch here? */) {
            // *** How did we get here!? ***
        }
    
        return elems;
    }
    

    stringstream 由一个 string getline 只需阅读,直到它看到行delimeter或 EOF . 所以我们不能得到任何类似的错误 boost::lexical_cast

    std::bad_alloc 早在 标准::getline 甚至会发生。我错过了什么?

    1 回复  |  直到 15 年前
        1
  •  6
  •   Roger Pate Roger Pate    16 年前

    我只看到你直接错过的是 ss.fail() bool(stream) !stream.fail() , stream.good() )如预期, ss.eof()

    然而,在实际发生的事情上可能会有一些混乱。因为 getline公司 使用 结束 德利姆 - 字段,输入数据,例如 "a\nb\n" 有两个而不是三个字段,这可能令人惊讶。对于行来说,这是完全有意义的(而且是POSIX标准的),但是有多少字段 德利姆 属于 '-' "a-b-"


    顺便说一句,我是这样想的 write split :

    template<class OutIter>
    OutIter split(std::string const& s, char delim, OutIter dest) {
      std::string::size_type begin = 0, end;
      while ((end = s.find(delim, begin)) != s.npos) {
        *dest++ = s.substr(begin, end - begin);
        begin = end + 1;
      }
      *dest++ = s.substr(begin);
      return dest;
    }
    

    deque<string> c;
    split("a-b-", '-', back_inserter(c));
    // c == {"a", "b", ""}
    
    推荐文章