Ich versuche, einen ganzen Stream (mehrere Zeilen) in eine Zeichenfolge einzulesen.
Ich benutze diesen Code und er funktioniert, aber er verletzt meinen Sinn für Stil ... Sicher gibt es einen einfacheren Weg? Vielleicht mit Stringstreams?
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.
Eigentlich würde ein
const
Verweis auf eine Zeichenfolge auch genügen, und das könnte die Sache einfacher machen ...
const std::string &s(... a miracle occurs here...)
string s = string(...)
.Ich bin zu spät zur Party, aber hier ist eine ziemlich effiziente Lösung:
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; }
Ich habe ein Benchmarking durchgeführt und es stellt sich heraus, dass die
std::istreambuf_iterator
Technik ( die von der akzeptierten Antwort verwendet wird ) tatsächlich viel langsamer ist. Bei gcc 4.4.5 mit-O3
ist es ungefähr ein 4,5-facher Unterschied auf meinem Computer, und die Lücke wird mit niedrigeren Optimierungseinstellungen größer.quelle
Du könntest es tun
std::string s; std::ostringstream os; os<<stream.rdbuf(); s=os.str();
aber ich weiß nicht, ob es effizienter ist.
Alternative Version:
std::string s; std::ostringstream os; stream>>os.rdbuf(); s=os.str();
quelle
istream::get(streambuf*)
undstd::getline(istream, string)
) lesen nur bis zu einem bestimmten Trennzeichen.Sie können versuchen, etwas von Algorithmen zu verwenden. Ich muss mich auf die Arbeit vorbereiten, aber hier ist ein sehr kurzer Überblick über die Dinge (es muss einen besseren Weg geben):
copy( istreambuf_iterator<char>(stream), istreambuf_iterator<char>(), back_inserter(s) );
quelle
Nun, wenn Sie nach einer einfachen und "lesbaren" Möglichkeit suchen, dies zu tun. Ich würde empfehlen, ein hochrangiges Framework für Ihr Projekt hinzuzufügen / zu verwenden. Dafür benutze ich immer Poco und Boost für alle meine Projekte. In diesem Fall mit Poco:
string text; FileStream fstream(TEXT_FILE_PATH); StreamCopier::copyToString(fstream, text);
quelle
Was ist mit getline mit Trennzeichen? Der nächste Code hilft mir, das ganze std :: cin auf Ubuntu mit g ++ - 10 in einen String zu lesen.
#include <iostream> #include <string> using namespace std; int main() { string s; getline(cin, s, {}); //the whole stream into variable s return 0; }
quelle
Vielleicht diese 1 Zeile C ++ 11 Lösung:
std::vector<char> s{std::istreambuf_iterator<char>{in},{}};
quelle
std::vector<char>
ist kein String.