PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : fwrite Problem



scma
28-01-2008, 09:16
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


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

anda_skoa
28-01-2008, 15:05
Ich befüchte ich kann dir nicht ganz folgen.

Wenn du nicht in eine Datei schreiben willst, welches Problem gibt es dann mit fwrite?
Das wird ja dann nicht benutzt, oder?

Ciao,
_

lokicall
28-01-2008, 19:52
Ich versteh nicht so ganz, was du willst. Ich vermute mal, das du die Daten von image lieber in einer Variable speichern willst, anstatt eine Konsolenausgabe zu machen. Dann ist sicherlich memcpy geeigneter als fwrite.

jan61
28-01-2008, 21:31
Moin,


Dann ist sicherlich memcpy geeigneter als fwrite.

Wozu die Mühe? In image ist doch das ganze Geraffel bereits im Speicher, das muss doch nur noch benutzt werden.

Jan

jay-t
07-02-2008, 06:46
Ich verstehe das so, daß er den Header (die printf() Ausgabe) und die
Bilddaten in einen Speicherbereich bekommen möchte.

Das ginge in etwa so:



unsigned char* image;
int bildbreite=200, bildhoehe=100;

/* Speicher für Header und Image Daten */
unsigned char *image_data;

unsigned char *ptr;
int header_length;

sprintf (image_data, "P6\n%d %d\n255\n", bildbreite, bildhoehe);
header_length = strlen (image_data);

ptr = image_data;
ptr = ptr + header_length; /* Stelle nach Header */
memcpy (ptr, image, bildbreite * bildhoehe * 3);


Wäre das so OK? Oder gibt es einen besseren Weg?

jan61
08-02-2008, 00:18
Moin,

Au Backe ;-) Du schreibst in einen Speicherbereich (image_data), der nicht initialisiert ist. Das gibt nen dicken Buffer-Overflow. Und wenn Du header_length nicht noch irgendwo anders brauchst - für die Kopiererei ist der überflüssig. Ungetestet:



unsigned char* image;
int bildbreite=200, bildhoehe=100;

/* Zwischenspeicher fuer Header: Platz fuer 2 * strlen(MAX_INT) +
Reserve fuer den Rest */
char header_buf[32];

/* Speicher für Header und Image Daten */
unsigned char *image_data;

/* Header aufbauen */
memset(header_buf, 0, sizeof(header_buf));
snprintf(header_buf, sizeof(header_buf)-1, "P6\n%d %d\n255\n", bildbreite, bildhoehe);

/* Platz fuer Speicher reservieren und mit 0 initialisieren */
image_data=(unsigned char *)calloc(strlen(header_buf)+bildbreite*bildhoehe*3 , sizeof(unsigned char));
if (image_data==NULL) /* ERROR! */
return(1);

/* Teile in den Speicher schubsen */
memcpy(image_data, header_buf, strlen(header_buf));
memcpy(image_data+strlen(header_buf), image, bildbreite*bildhoehe*3);

/* Tue was mit image_data */

/* Am Ende image_data wieder freilassen */
free(image_data);
Jan

jay-t
08-02-2008, 16:16
Das man image_data vorher noch reservieren muß ist mir klar.
Es ging nur um das Prinzip! Soll ich ihm alles vorkauen?

Und header_length ist bei meinem Beispiel nicht überflüssig!!