代码之家  ›  专栏  ›  技术社区  ›  Roddy

如何将整个流读入std::字符串?

  •  62
  • Roddy  · 技术社区  · 14 年前

    我试图将整个流(多行)读入一个字符串。

    void Obj::loadFromStream(std::istream & stream)
    { 
      std::string s;
    
      std::streampos p = stream.tellg();  // remember where we are
    
      stream.seekg(0, std::ios_base::end); // go to the end
      std::streamoff sz = stream.tellg() - p;  // work out the size
      stream.seekg(p);        // restore the position
    
      s.resize(sz);          // resize the string
      stream.read(&s[0], sz);  // and finally, read in the data.
    


    实际上,一个 const
    const std::string &s(... a miracle occurs here...)
    
    6 回复  |  直到 7 年前
        1
  •  122
  •   Cubbi    9 年前

    怎么样

    std::istreambuf_iterator<char> eos;
    std::string s(std::istreambuf_iterator<char>(stream), eos);
    

    (如果不是MVP,则可以是一行)

    2011年后的编辑,这种方法现在拼写

    std::string s(std::istreambuf_iterator<char>(stream), {});
    
        2
  •  28
  •   Community Neeleshkumar S    7 年前

    我来晚了,但这里有一个相当有效的解决办法:

    std::string gulp(std::istream &in)
    {
        std::string ret;
        char buffer[4096];
        while (in.read(buffer, sizeof(buffer)))
            ret.append(buffer, sizeof(buffer));
        ret.append(buffer, in.gcount());
        return ret;
    }
    

    std::istreambuf_iterator used by the accepted answer )实际上要慢得多。合同通用条款第4.4.5条 -O3 ,在我的机器上大约有4.5倍的差异,并且随着优化设置的降低,差距变得更大。

        3
  •  20
  •   Matteo Italia    14 年前

    std::string s;
    std::ostringstream os;
    os<<stream.rdbuf();
    s=os.str();
    

    但我不知道是否更有效。

    替代版本:

    std::string s;
    std::ostringstream os;
    stream>>os.rdbuf();
    s=os.str();
    
        4
  •  11
  •   wheaties    14 年前

    你可以尝试使用一些算法。我必须为工作做好准备,但这里有一个非常快速的方法(必须有更好的方法):

    copy( istreambuf_iterator<char>(stream), istreambuf_iterator<char>(), back_inserter(s) );
    
        5
  •  1
  •   wdavilaneto    8 年前

    好吧,如果你正在寻找一个简单和'可读'的方式来做。我建议在您的项目中添加/使用一些高级框架。为此,我总是在我所有的项目中使用Poco和Boost。在这种情况下,对于Poco:

        string text;
        FileStream fstream(TEXT_FILE_PATH);
        StreamCopier::copyToString(fstream, text);
    
        6
  •  0
  •   Vahag Chakhoyan    4 年前

    如何使用带分隔符的getline?下一段代码帮助我在带有g++-10的ubuntu上将整个std::cin读入字符串。

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    int main() {
        string s;
    
        getline(cin, s, {}); //the whole stream into variable s
    
        return 0;
    }
    
        7
  •  -1
  •   user7223715    8 年前

    也许这1行C++ 11解决方案:

    std::vector<char> s{std::istreambuf_iterator<char>{in},{}};