setmode() und fwrite(). Es spinnt oder so ...
-
Servus,
ich hänge an einem merkwürdigen Problem:
Programm (lauffähig und brutal zurechtgestutzt, es treten keine Fehler auf):
#include <stdio.h> #include <stdlib.h> #include <fcntl.h> char fbuf[500000]; main (argc, argv) int argc; char *argv[]; { int size; memset( fbuf, '*', sizeof( fbuf)); setmode( fileno( stdout), O_BINARY); fputs( "Zeile\n", stdout); size = 200000; fwrite( fbuf, size, 1, stdout); fputs( "Noch eine Zeile\n", stdout); size = 0xff; fwrite( fbuf, size, 1, stdout); free( fbuf); return 0; }
Die Ausgabe auf der console ist dann:
G:\test>bin\usget
Zeile
Noch eine Zeile
********************************************************************************
********************************************************************************
********************************************************************************
***************
G:\test>Entferne ich setmode() wird auch der erste String ausgegeben.
Win XP prof, Watcom C 1.9.
Im Web gibt es so Zocken mit setmode() und stdout, ist aber alles etwas
unklar. Der Programmteil läüft in einem anderen Kontext ohne Probleme,
auch mit einer Pipe macht der obige Code keine Zicken. lt. C99 ist
setmode() für stdout nicht so 100%ig definiert. In einem größeren Programm
verwende ich obige Konstruktion ohne Probleme ...Wie kann es sein, daß fwrite() da solche Hänger hat ?
Ich sehe im Program keine Fehler mehr.Grüße Joe
-
fwrite macht keine Fehler.
Der Fehler sitzt vor der Tastatur.
- setmode ist in diesem Fall völlig überflüssig
- du solltest langsam mal vom K&R Style auf den Standard umsteigen
- free() ist hier UB
- spendiere mal ein fflush(stdout) am SchlussProgramm (lauffähig und brutal zurechtgestutzt, es treten keine Fehler auf):
Ich tippe aber mal darauf, dass es an deinem "brutalen Zurechtstutzen" liegt, dass der Fehler auftritt, du also keinen entsprechenden Überblick über dein Programm hast.
-
Das free() habe ich vergessen herauszunehmen.
setmode() brauche ich um mit fwrite PDFs auf den Apache rauszuschieben
(kann Binärdaten enthalten).
-
Ach so, du willst anhand eines Extrem-Extraktes, das den Fehler nicht aufzeigt, Hinweise auf den Fehler im Originalcode haben.
Tut mir leid, ich kann sowas nicht.
-
Nein - genau dieses Programm zeigt den Fehler.
Unter Watcom C 1.9 und Borland C.
-
Ich habe mir die Sourcen der Watcom C-Lib mal vorgenommen.
Es ist schon eine wilde Mischung mit -zig #defines ...
fwrite() ruft im Binärmodus mit 512 Byte Blöcken write() auf, diese schnappt
sich os_write() und das schickt es per WriteFile() an den Apache.fwrite() im Textmode verwendet profanes fputc().
Auch mit einem direkten Aufruf von WriteFile() funktioniert das Testprogramm
nicht. Aber immer nur dann, wenn ich mit setmode() auf binär schalte.Nebenbei ist ein fflush() am Programmende nicht notwendig. Strenggenommen
ein close() auch nicht ...