seg fault mit fclose()

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
Bruno
Beiträge: 41
Registriert: Do Jul 14, 2011 7:04 am

seg fault mit fclose()

Beitrag von Bruno » Mi Nov 16, 2011 8:13 am

Hallo!

Ich habe ein hartnäckiges Problem mit fclose, was ständig zu einem Absturz führt.

Ich mache folgendes:

Code: Alles auswählen

FILE *Datei ;
Datei = fopen(includes[0], "r" );
  if (!Datei){
/* tue was */
}
if (Datei){fclose(Datei);}
/* 
tue wieder was
*/
Datei = fopen(FileName, "r+w" );
  if (!Datei){
/* tue was */
}
if (Datei){fclose(Datei);}
/* 
tue wieder was
*/
Datei = fopen("Analyse.txt", "r+w" );
/* 
tue wieder was
*/
// und bis hier kommt der Code bevor er abbricht...
if (Datei){fclose(Datei);}
Die ersten beiden fopen-fclose Abschnitte laufen problemfrei, der dritte verursacht
folgendes:
Program terminated with signal 11, Segmentation fault.
#0 0x0000003467a60d67 in fclose@@GLIBC_2.2.5 () from /lib64/libc.so.6
#0 0x0000003467a60d67 in fclose@@GLIBC_2.2.5 () from /lib64/libc.so.6

Ich weiß, daß man ein fclose nicht auf eine bereits geschlossene Datei machen soll, aber hier bin ich mir ziemlich sicher, daß ich das nicht mache wg. if(Datei)...

Kann mir da wer weiterhelfen??

Ciao

Bruno
"21" ist nur die halbe Wahrheit...

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: seg fault mit fclose()

Beitrag von Xin » Mi Nov 16, 2011 8:46 am

Auf den ersten Blick fällt mir nur auf, dass die Open-Flags beim 2. und 3. falsch sind. Es gibt kein "r+w".
Siehe fopen.

Würde dieses Programm schon abstürzen, wenn man int main() davorsetzt?
Ich befürchte, dass hier eher etwas in "tut irgensdwas" schief läuft.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Bruno
Beiträge: 41
Registriert: Do Jul 14, 2011 7:04 am

Re: seg fault mit fclose()

Beitrag von Bruno » Mi Nov 16, 2011 12:25 pm

Hallo!

Danke für die Hilfe!

Das r+w scheints gewesen zu sein.
Nach einem fopen(...,"r+w"); führt ein fclose zum Absturz.
ich habe jetzt alles mit fopen(...,"w+"); kompiliert und bislang läufts fehlerfrei.

Merkwürdig nur, daß der Compiler nicht meckert...

Ciao

Bruno
"21" ist nur die halbe Wahrheit...

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: seg fault mit fclose()

Beitrag von Xin » Mi Nov 16, 2011 1:04 pm

Bruno hat geschrieben:Merkwürdig nur, daß der Compiler nicht meckert...
Die Funktion erwartet ein (char const *) und Du übergibst ein (char const *).
Syntaktisch und semantisch ist der Code vollkommen korrekt: Kein Gemecker.

Dass die Funktion "r+w" nicht lesen will, ist hingegen schon merkwürdig, denn "r+w" hat vermutlich schon jeder geschrieben und an einen Absturz kann ich mich nicht erinnern. Ich programmiere unter Linux, Mac und früher unter AmigaOS.

Worunter programmierst Du?
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Bruno
Beiträge: 41
Registriert: Do Jul 14, 2011 7:04 am

Re: seg fault mit fclose()

Beitrag von Bruno » Mi Nov 16, 2011 1:07 pm

Hallo!

Ich nehme gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-51). Wobei ich ihn schon auf höchste "Meckerstufe" gestellt habe.
Arbeite aber unter Red Hat Enterprise Linux Client release 5.7 (Tikanga).

Ciao

Bruno
"21" ist nur die halbe Wahrheit...

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: seg fault mit fclose()

Beitrag von Xin » Mi Nov 16, 2011 1:16 pm

Bruno hat geschrieben:Ich nehme gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-51). Wobei ich ihn schon auf höchste "Meckerstufe" gestellt habe.
Wie gesagt, der Compiler hat keinen Grund zu meckern, da der Code absolut korrekt ist. Dass Du die Funktion mit den falschen Werten fütterst, kann er ja nicht wissen.

Das Problem ist die libstdc - also abgesehen davon, dass Du fopen() mit den falschen Werten fütterst.
Das sollte aber problemlos abgefangen werden können - eine unschöne Reaktion.
Bruno hat geschrieben:Arbeite aber unter Red Hat Enterprise Linux Client release 5.7 (Tikanga).
...wobei mich das allerdings auch wieder wundert.

Ich denke, den Fehler unter Linux nämlich auch schon begangen zu haben ;-)
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten