Nun, Sie müssen eine char*
irgendwie erstellen, da das ist, was die Funktion erfordert. (BTW: Sie sprechen über die Posix-Funktion read
, nicht wahr, und nicht std::istream::read
?) Das Problem ist nicht die char*
, ist es, was die char*
Punkte (was ich vermute, ist das, was Sie eigentlich gemeint ist).
Die einfachste und übliche Lösung hier ein lokales Array zu verwenden wäre:
char buffer[43];
int len = read(fd, buffer, 42);
if (len < 0) {
// read error...
} else if (len == 0) {
// eof...
} else {
std::string data(buffer, len);
}
Wenn Sie direkt in eine std::string
jedoch erfassen möchten, dann ist dies möglich (wenn auch nicht unbedingt eine gute Idee):
std::string data;
data.resize(42);
int len = read(fd, &data[0], data.size());
// error handling as above...
data.resize(len); // If no error...
Dies vermeidet die Kopie, sondern ganz offen ... die Kopie ist unbedeutend Vergleich zu der Zeit, die für die tatsächliche Lese- und für die Zuteilung o f der Speicher in der Zeichenfolge. Dies hat auch den (wahrscheinlich vernachlässigbaren) Nachteil der resultierenden Zeichenkette mit einem tatsächlichen Puffer von von 42 Bytes (aufgerundet auf was auch immer), anstatt nur das Minimum , das für die tatsächlich gelesenen Zeichen notwendig ist.
(Und da die Menschen manchmal die Frage aufwerfen, in Bezug auf die Kontiguität des Speichers in std:;string
: Das war ein Problem, zehn oder mehr Jahre Die ursprünglichen Spezifikationen für std::string
wurden expressedly von nicht zusammenhängenden zu ermöglichen. Implementierungen, entlang der Linien von der damals populären rope
Klasse.In der Praxis fand kein Hersteller diese als nützlich, und die Leute begannen, Kontiguität anzunehmen.An diesem Punkt, der Normungsausschuss beschlossen, den Standard mit bestehenden Praxis auszurichten und Kontiguität erfordern. Also ... keine Implementierung überhaupt nicht hat zusammenhängenden gewesen, und keine zukünftige Umsetzung wird contiguity verzichten, die Anforderungen in C++ gegeben. 11)
Wenn zero-copy Ihr Ziel ist, würde es Ihnen helfen, "read" durch "mmap" zu ersetzen und dann einen fest zugewiesenen std :: string darum zu legen? – user1202136
Gibt es Leerzeichen in der Zeichenfolge, die Sie gerade lesen? –