Binär Zeichen von der Konsole einlesen

Der Wolf

Erfahrenes Mitglied
Hi Leute,

ich versuche gerade die Daten, die ich über eine Pipeline auf meiner Kommandozeile einlese
in einem weiteren C++ Programm zu verarbeiten. Dafür verwende ich die pstreams library
(http://pstreams.sf.net), was bedeutet, dass ich in meinem C++ Programm ein Object besitze,
dass mir den System Aufruf und die entsprechenden Pipelines kapselt, so das ich direkt davon
lesen kann. Das Problem ist, die Daten, die von der Kommandozeilen Pipeline kommen, werden
als Binary Paket ohne newline escape geschrieben, weshalb ich kein readLine() verwenden kann. Ich habe schon ein wenig versucht mit read() und readsome() etc herumzuspielen, aber eine richtig saubere Lösung habe ich bisher noch nicht gefunden.

C++:
int
main(int argc, char* argv[]) {

	// Create and start command line pipeline.
	redi::ipstream in("arecord -D plug:hw:1 -r 16000 -t raw -c 1 -f S16_LE | fex -v mfcc 1.4");

	std::vector<char> result;
	
	char buf[1024];
	std::streamsize n;
	while (true) {		

		int counter = 0;
		while ((n = in.out().readsome(buf, 1024)) > 0) {
			result.insert(result.end(), buf, buf + n);			
			counter += n;
		}

		if (counter > 0) {
			displayResult(&result, counter / sizeof(float));
			result.clear();
		}		
	
	}

}

Das Problem ist, der obige Code liest immer genau 4096 byte ein, was, denke ich mal, dem internen Buffer des std::basic_istream entspricht. Sollte ich immernur soviele bytes aus dem Buffer abrufen, wie das Ergebnis der Cmd-Pipeline lang ist und den Rest der Daten verwerfen? Ich würde mich über einige gute Ratschläge freuen.

Gruß
Der Wolf
 
Zuletzt bearbeitet von einem Moderator:
Hi.

readsome liest nicht alle Daten bzw. auch mal 0 Bytes wenn keine Daten verfügbar sind. Du müßtest solange lesen bis der Streamzustand bad, eof oder fail ist.

Da du aber gar nichts nebenbei machen willst, benutze einfach nur read und gcount.

Gruß
 
Zuletzt bearbeitet:
Zurück