Fehler bei fopen

08/07/2010 - 17:01 von Chris | Report spam
Moin,

ich habe ein ca. 6 Jahre altes C-Programm wieder ausgegraben, dass ich mir damals
mal geschrieben hatte.
Es kompiliert auch immer noch brav, wie es soll.
Leider tut es dann nicht mehr wie gewünscht.

Offenbar funktioniert fwrite nicht mehr, und ich weiß jetzt nicht, wieso.
Habe mich aber auch seit gefühlten 5 Jahren nicht mehr so richtig mit C beschàftigt,
außer mal hier oder da was zu verschlimmbessern :-)
Daher ist die Frage ev. etwas DAU, but anyways:

Dies ist der Code:
<snip>
/*create file if possible*/
if ((out = fopen(filename,"wb")) == NULL) {
printf("Unable to open %s",filename);
exit(1);
}
/*write header*/
fwrite(header,strlen(header),1,out);

/*write image byte per byte to file if possible*/
if (fwrite(image,imagesize,1,out) != 1) {
printf("Unable to write in %s",filename);
exit(1);
}
</snip>

Und dies ist das strace:
i
<snip>
open("image_0.pgm", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 4
fstat(4, {st_mode=S_IFREG|0664, st_size=0, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f555609e000
write(1, "Unable to write in image_0.pgm", 31Unable to write in image_0.pgm
) = 31
write(4, "P521332 21828255", 19) = 19
exit_group(1) = ?
</snip>

Was làuft da falsch?
Hat sich da irgendwas geàndert, an den Specs (neuer gcc etc.), in den letzten 6 Jahren?
Vielen Dank im Voraus,

Chris

Linux is great for calculating how much hemp-based tofu it might take to fill
your bio-gas-powered eco-dome, but for all serious jobs you need a serious
operating system such as Microsoft Windows.
<http://shelleytherepublican.com>
 

Lesen sie die antworten

#1 Jan Seiffert
08/07/2010 - 19:44 | Warnen spam
Chris schrieb:
Moin,

ich habe ein ca. 6 Jahre altes C-Programm wieder ausgegraben, dass ich mir damals
mal geschrieben hatte.
Es kompiliert auch immer noch brav, wie es soll.
Leider tut es dann nicht mehr wie gewünscht.

Offenbar funktioniert fwrite nicht mehr, und ich weiß jetzt nicht, wieso.
Habe mich aber auch seit gefühlten 5 Jahren nicht mehr so richtig mit C beschàftigt,
außer mal hier oder da was zu verschlimmbessern :-)



Aber auf das naheliegendste dir mal die Ergebnisse von fwrite ausgeben zu lassen
bist du nicht gekommen?
;)

Daher ist die Frage ev. etwas DAU, but anyways:

Dies ist der Code:
<snip>
/*create file if possible*/
if ((out = fopen(filename,"wb")) == NULL) {
printf("Unable to open %s",filename);



fprintf(stderr, "Unable to open \"%s\": %s",filename,strerror(errno));

Da du den Dateinamen mit drin haben willst kannst du perror leider nicht nehmen...

exit(1);
}
/*write header*/
fwrite(header,strlen(header),1,out);

/*write image byte per byte to file if possible*/
if (fwrite(image,imagesize,1,out) != 1) {
printf("Unable to write in %s",filename);



fprintf(stderr, "Unable to write in \"%s\": %s",filename,strerror(errno));


exit(1);
}
</snip>

Und dies ist das strace:
i
<snip>
open("image_0.pgm", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 4



fopen benutzt halt im hintergrund open.

fstat(4, {st_mode=S_IFREG|0664, st_size=0, ...}) = 0



die Libc schwurbelt da fuer die Fileposition noch ein wenig rum.

mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f555609e000



stdio ist buffered, also machen wir mal ein malloc.
Hier sind wir dann mit fopen fertig.

write(1, "Unable to write in image_0.pgm", 31Unable to write in image_0.pgm
) = 31



tja, und dann kommt schon dein printf.
Keine Spur von problem...

write(4, "P521332 21828255", 19) = 19



Hier wird out auch gefluscht, und siehe da, es sind auch 19 byte zu schreiben.

exit_group(1) = ?
</snip>

Was làuft da falsch?



Keine ahnung, ich tippe dein "!= 1" schlaegt fehl, aber woran das liegt...

Hat sich da irgendwas geàndert, an den Specs (neuer gcc etc.), in den letzten 6 Jahren?



Noe
Es sei denn dein Code sieht nicht so aus oder deine libc/gcc/kernel/whatever ist
_schwer_ buggy. Aber letzteres glaube ich irgendwie nicht, aehnliches hatte ich
"letztens" noch laufen.
Also, -v. Vielleicht hilft ltrace.

Vielen Dank im Voraus,

Chris




Gruss
Jan


Profanity is the one language all programmers know best.

Ähnliche fragen