Verhalten von fcloseall und dessen Einsatzgebiet
-
@Wade1234 sagte in Verhalten von fcloseall und dessen Einsatzgebiet:
undefiniertes verhalten bedeutet doch, dass man die bedienungsanleitung des compilers lesen soll, oder nicht?
Ist das als Witz gemeint? Falls nicht: Geh bei undefiniertem Verhalten davon aus, dass theoretisch dein Programm die Welt explodieren lässt. Es ist undefiniert, es kann alles passieren. Der Compiler definiert da nichts, er nimmt schlicht keine Rücksicht. Sonst wäre es Implementations spezifisches Verhalten.
-
und ihr könnt da keinen "designfehler" oder so entdecken?
-
@Wade1234
Youtube: Chandler Carruth über Undefined Behaviour
-
@Wade1234 sagte in Verhalten von fcloseall und dessen Einsatzgebiet:
und ihr könnt da keinen "designfehler" oder so entdecken?
Nein. Wenn du's kuschelig warm und immer (*) definiert haben willst, dann musst du ne "managed" Sprache ala Java oder C# verwenden. Wenn dich das jetzt überrascht, dann könnte vielleicht ein Bisschen Backgroundwissen nicht schaden. Also darüber wie Computer allgemein so funktionieren (CPU, RAM, Registert), wie Speicherverwaltung typischerweise gemacht wird und wie das so mit den Zeigern ist.
*: Naja, ne, leider doch nicht immer. Aber eher/öfter als bei C++.
-
naja also ich weiß, dass ich ungültige zeiger auf NULL setzen soll, damit das programm, wenn ich diesen zeiger fehlerhafterweise verwende, gesichert abstürzt und nicht mit falschen werten weiter läuft, und wahrscheinlich sollte man das mit dateideskriptoren auch so machen.
-
Habs auch mal (mit VS) getestet. fwrite() reagiert tatsächlich allergisch auf einen geschlossenen FILE*.
Aber mit einen kleinen Trick lässt sich das umgehen:
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> int main() { FILE *f1 = fopen("c:\\f1", "w"); FILE *f2 = fopen("c:\\f2", "w"); printf("%d\n", _fileno(f1)); // positive zahl printf("%d\n", _fileno(f2)); // " " _fcloseall(); printf("%d\n", _fileno(f1)); // -1 printf("%d\n", _fileno(f2)); // dito }
Also vor dem Zugriff immer mit _fileno() auf Gültigkeit des FILE* checken, dann klappt's auch mit _fcloseall().
Btw, Nach einem gezielten fclose() spuckt _fileno() auch -1 aus.
-
@RBS2 Hmmmm
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/fileno?view=vs-2017
The result is undefined if stream does not specify an open file.
-
@Dravere sagte in Verhalten von fcloseall und dessen Einsatzgebiet:
@RBS2 Hmmmm
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/fileno?view=vs-2017
The result is undefined if stream does not specify an open file.
Da wollte MS wohl wieder etwas anders machen.
Upon successful completion, fileno() shall return the integer value of the file descriptor associated with stream. Otherwise, the value -1 shall be returned and errno set to indicate the error.
http://pubs.opengroup.org/onlinepubs/009696899/functions/fileno.html
-
@RBS2
Ich finde das inzwischen bewundernswert, mit welcher Ignoranz und Hartnäckigkeit du deinen Standpunkt verteidigst. Hat irgendwie so´n Flachweltler-Charme. Witzig anzuhören, aber nicht ernst zu nehmen.
-
@DocShoe sagte in Verhalten von fcloseall und dessen Einsatzgebiet:
Hat irgendwie so´n Flachweltler-Charme.
Dass die Erde eine Scheibe ist, weiß doch inzwischen jeder auf dem gesamten Globus.