2013-04-08 8 views
5

Ich bin ziemlich vertraut mit den meisten C++, aber ein Bereich, den ich vermieden habe, war IO-Streams, vor allem, weil ich es auf Embedded-Systemen verwendet habe Sie sind nicht angemessen. Vor kurzem musste ich mich jedoch mit ihnen vertraut machen, und ich kämpfe darum, etwas herauszufinden, das meiner Meinung nach einfach sein sollte.Lesen einer bestimmten Anzahl von Zeichen aus C++ Stream in Std :: String

Was ich suche nach einer relativ effizienten Möglichkeit, eine feste Anzahl von Zeichen aus einem C++ - Stream in eine std::string zu lesen. Ich könnte leicht in eine temporäre char-Array mit der read()-Methode lesen und diese in eine std::string konvertieren, aber das ist ziemlich hässlich und beinhaltet eine verschwenderische Kopie.

std::string getFile(std::fstream &inFile) 
{ 
    std::stringstream buffer; 
    buffer << inFile.rdbuf(); 
    return buffer.str(); 
} 

... aber unbegrenzt liest in den Speicher sind in der Regel eine schlechte Idee, so würde ich die Datei wirklich einen Block zugreifen möchte: Ich könnte auch mit so etwas wie dies die Gesamtheit eines Stroms in einen String gelesen zu einer Zeit sage 4K oder so. Ich könnte auch Zeichen auf einmal lesen, aber das fühlt sich einfach hässlicher und weniger effizient an als das Lesen in ein temporäres Array.

Also, gibt es einen einfachen Weg, um eine std::string direkt aus einem Strom, der die nächsten N Zeichen aus dem Strom enthält? Es mag gut sein, dass es dazu einfach keinen Weg gibt, aber es erscheint mir komisch, dass so etwas fehlen würde, so dass ich das Gefühl hatte, etwas ganz offensichtlich zu verpassen.

Übrigens, ich bin ziemlich vertraut mit den C-File-IO-APIs und ich bin nicht auf der Suche nach einer Lösung mit ihnen. Ich könnte etwas mit read() und write() klopfen, aber der Code, mit dem ich arbeite, verwendet Streams und ich denke, es ist gute Praxis, meine Code-Ergänzungen in einem einheitlichen Stil zu halten.

+0

Siehe [diese] (http://stackoverflow.com/questions/9521629/stdstringss-capacity-reserve-resize-functions) und [dies] (http://stackoverflow.com/questions/14286526/the-usage -of-stringReserve). –

Antwort

8

Sie sind auf dem richtigen Weg. :)

mystring.resize(20); 
stream.read(&mystring[0], 20); 

Edit:

In C++ 11. das ist klar definiert und sicher. Im Gegensatzdata() und c_str(), std::string::operator[] bietet eine veränderbare Referenz auf die zugrunde liegenden Daten.

in C++ 03, es in praktischer Hinsicht sicher ist, aber die Definition von std::string war zu schwach, um Garantie diese Sicherheit. C++03 allowed Zeichenfolge Daten nicht zusammenhängend sein, aber ich glaube nicht, dass jede verfügbare Implementierung jemals davon profitiert.

+1

+1. Trickreich. Warum kam mir das nicht in den Sinn? – Nawaz

+0

@Nawaz Ich war ziemlich geschockt, als es zu meiner kam. :) –

+0

Ich kenne * das Gefühl * wenn solche kniffligen Ideen in den Sinn kommen und dir das Leben leichter macht! – Nawaz

Verwandte Themen