fwrite Problem

MS47475

Mitglied
Hallo,

ich habe grad ein Problem mit der fwrite-Funktion. Und zwar verstehe ich nicht genau, wozu die Blockgröße da sein soll. Es geht um folgenden Code, welches normalerweise eine Netpbm PPM "rawbits" Bild-Datei schreibt. Der Befehl wäre dann zum Beispiel ./prog > bild.ppm
Code:
unsigned char* image;
int bildbreite=200, bildhoehe=100;
...
printf("P6\n%d %d\n255\n", bildbreite, bildhoehe);
fwrite(image, 3, bildbreite*bildhoehe, stdout);
Das funktioniert ja auch ganz gut. Jetzt möchte ich aber nicht eine Datei schreiben, sondern das als komplettes Bild im Speicher halten. Dazu ist es nötig, die Ausgabe von printf und fwrite zusammen zu fassen. Das gelingt mir aber beim besten Willen nicht.
Eigentlich kann das ja nicht viel sein, aber ich komme momentan nicht weiter.
Bin für jede Hilfe dankbar.

Gruß
Markus
 
Hi.

Das Problem ist, dass stdout ein Textstream ist. Du versuchst Binärdaten auf diesem Stream auszugeben. Das ist keine gute Idee. Verwende eine Datei die du im Binärmodus geöffnet hast.

Dann solltest du grundsätzlich prüfen ob die Schreiboperationen erfolgreich waren oder nicht.

Gruß

PS: Du könntest auch die freopen() Funktion versuchen (kommt drauf an, ob deine C Bibliothek / dein Betriebssystem das unterstützt):
C:
if (freopen(NULL, "wb", stdout) == NULL) { /* Fehler... */ }
PPS: Evtl. ist es notwendig zwischen fprintf und fwrite ein fflush() einzufügen.
 
Zuletzt bearbeitet:
Schönen Dank für die schnelle Antwort, aber es kann sein dass ich mich falsch ausgedrückt habe. Das schreiben in eine Datei funktioniert über stdout, jedoch möchte ich nicht in eine Datei schreiben. Vielmehr möchte ich eine entsprechende Lösung finden, wie ich das alles in einen Puffer, also im Speicher unterbringen kann.
Das Problem dabei ist, das ich nicht verstehe und nicht weiß, wie ich das umsetzen soll.
Versucht habe ich es auf folgende Weise:
Code:
unsigned char* image;
unsigned char image_tmp[20000];//zu testzwecken uebertrieben :-)
int bildbreite=200, bildhoehe=100;
...
//printf("P6\n%d %d\n255\n", bildbreite, bildhoehe);
//fwrite(image, 3, bildbreite*bildhoehe, stdout);

//ersetze printf("P6\n%d %d\n255\n", bildbreite, bildhoehe);
strcat(image_tmp, "P6\n");
strcat(image_tmp, int_to_string(bildbreite) );
strcat(image_tmp, " ");
strcat(image_tmp, int_to_string(bildhoehe) );
strcat(image_tmp, "\n255\n");

//ersetze fwrite(image, 3, bildbreite*bildhoehe, stdout);
strcat(image_tmp, image);

Aber bei der letzten Zeile liegt das Problem. Wie setze ich da die Blockgröße von fwrite um? Man, hätte nicht gedacht, dass ich mich hiermit so schwer tue :confused:
 
Hi.

Die Bilddaten sind doch aber keine Strings. Da wird es dir nicht helfen Stringfunktionen zu verwenden.

Du müßtest einfach nur die Daten kopieren. Z.B. mit memcpy:
C:
//ersetze fwrite(image, 3, bildbreite*bildhoehe, stdout);
memcpy(image_tmp, image, 3 * bildbreite*bildhoehe);
Du müßtest dann natürlich immer selbst dafür sorgen, dass der Zeiger entsprechend weitergesetzt wird.

Falls du C++ verwendest, könntest du einfach einen ostringstream verwenden.

Gruß
 
Hi.

Die Bilddaten sind doch aber keine Strings. Da wird es dir nicht helfen Stringfunktionen zu verwenden.

Du müßtest einfach nur die Daten kopieren. Z.B. mit memcpy:
C:
//ersetze fwrite(image, 3, bildbreite*bildhoehe, stdout);
memcpy(image_tmp, image, 3 * bildbreite*bildhoehe);
Du müßtest dann natürlich immer selbst dafür sorgen, dass der Zeiger entsprechend weitergesetzt wird.

Falls du C++ verwendest, könntest du einfach einen ostringstream verwenden.

Gruß

Funktioniert spitze. Vielen vielen Dank für die schnelle und kompetente Antwort.

Gruß
Markus
 
Zurück