C ++ nicht null abgeschlossene Char-Array-Ausgabe

7

Ich habe versucht, ein nicht null beendetes Char-Array in eine Datei auszugeben.

Tatsächlich, ich empfange Pakete und drucke dann ihre Felder.

Nun, da diese Felder nicht null-terminiert sind, z. B. ein Datensegment, das eine Größe von 512 hat, aber möglicherweise nicht vollständig belegt ist.

Wenn ich diese Daten in eine Datei schreibe, verwende ich einfach & lt; & lt; Überladene Funktion, die nichts über tatsächliche Daten weiß und nur nach der Beendigung des Datensegments sucht.

Also, wie kann ich der Ausgabefunktion mitteilen, dass nur so viel spezifische Anzahl von Bytes geschrieben wird?

Anstatt etwas zu verwenden, das jedes Mal teuer zu nennen ist:

%Vor%     
changed 09.10.2009, 07:31
quelle

5 Antworten

16

Wenn Sie maxbytes bytes eingeben möchten, verwenden Sie write method

%Vor%

Wenn Sie weniger Bytes im Puffer haben können, woher wissen Sie, wieviele davon Ihr Puffer enthält? Wenn '%code%' das Pufferende markiert, können Sie Folgendes schreiben:

%Vor%     
Tadeusz Kopec 09.10.2009, 07:49
quelle
3

Eine billige Lösung wäre, einen Puffer zu haben, der Platz für ein zusätzliches Null-Zeichen hat, und einfach ein Nullzeichen an dem Punkt zu setzen, an dem Sie die tatsächliche Größe kennen und dann den Null-terminierten Puffer ausgeben, wie Sie es bereits tun. Schnell und zuverlässig.

    
sharptooth 09.10.2009 07:34
quelle
3

Dies funktioniert, ist aber nicht sicher gegen das versehentliche Aufrufen der standardmäßigen char* -Version von operator<< :

%Vor%

Dies ist sicherer, wenn Sie einen maxw -Typ verwenden, der die Länge der nächsten char* -Ausgabe begrenzt:

%Vor%     
Pete Kirkham 09.10.2009 08:20
quelle
0

Ich sehe hauptsächlich zwei Lösungen.

Bei ASCII-Daten:

%Vor%

Dann haben Sie immer eine klare nullterminierte Zeichenfolge im Buffor.

Zweite bei ASCII-Daten:

%Vor%     
bua 09.10.2009 08:21
quelle
0

Wenn Sie das letzte Byte nicht interessieren, können Sie einfach

%Vor%

und dann füttern Puffer zu welcher gewünschten String-Funktion. Wenn es kürzer ist, wird alles auf den Null-Terminator laufen, der bereits existiert , und wenn es keinen Terminator gab, wird es zu dem laufen, den Sie gerade erstellt haben.

Und es ist schnell:)

    
Combuster 09.10.2009 10:20
quelle

Tags und Links