Programm stürzt ab

Razorhawk

Webdesigner und MSP
Ich hab ein Problem und weiß nicht so recht wie ich den Fehler beseitigen soll.

Ich lese in diesem Programm eine Datei aus (unter anderem), doch seid ich diesen Teil fertig geschrieben habe und es daran geht die Datei auszulesen, schmiert mir das Programm immer ab.
Vielleicht kann einer von euch einen Fehler entdecken. Vielleicht benutze ich aber auch das Auslesen der Dateil vollkommen falsch.

Code:
#include <stdio.h>

int main()
{ float kurs,euro,anzUmtausch=1.0,kleinstEuro,groesstEuro,mittEuro=0.0,euroK,murK;
  int mur;

  
 printf("Bitte geben sie einen Geldbetrag in Mauritius-Rupie ein: \n");
 scanf("%d",&mur);
    
 FILE *fp;
 fp = fopen ("wechselkurs.dat", "r");
 fscanf(fp, "%f", &kurs );
 fclose ( fp );
 
 euro = kurs*mur;

 printf("Der Kurs in Euro beträgt %f",euro);
 

 fp = fopen ("mur2eur.dat", "a");
 fprintf(fp, "%d \t %f \n", mur, euro);
 fclose ( fp );
 
 
 
 fp = fopen ("mur2eur.dat", "r");
 fscanf(fp,"%d \t %f",euroK,murK);
 kleinstEuro = euroK = groesstEuro;
 
 while(!feof(fp)){

   fscanf(fp,"%d \t %f",euroK,murK);
   kleinstEuro = (kleinstEuro > euroK) ? euroK: kleinstEuro;
   groesstEuro = (groesstEuro < euroK) ? euroK: groesstEuro;
   anzUmtausch++; 
   mittEuro = mittEuro + euroK;
 
 }
 mittEuro = mittEuro / anzUmtausch;
 fclose ( fp );
 
printf("%f   /f   /f   /f",kleinstEuro,groesstEuro,anzUmtausch,mittEuro);

    
 return (0);
}
 
Hallo!

jedes fopen kann fehlschlagen daher immer prüfen ob auch ein gültiger Zeiger zurückgegeben wurde. (z.B.: die Datei existiert nicht... etc...)
Code:
if(!(fp = fopen ("wechselkurs.dat", "r")))
{
  perror("FEHLER: lesen von wechselkurs.dat");
  //Lesefehler hier behandeln
}
else
  fscanf(fp, "%f", &kurs );

if(fp)
fclose ( fp );

außerdem wäre es nett den Inhalt der wechselkurs.dat zu posten (am besten als Attachment)

lg
Johannes
 
Hi.

Du solltest immer erstmal prüfen, ob die Datei auch geöffnet werden konnte bevor du versuchst von der Datei zu lesen oder in die Datei zu schreiben:

Code:
FILE* fp;

if ((fp = fopen ("test.dat", "r")) != NULL) {
  // Datei wurde zum Lesen geöffnet
  ...
  fclose (fp);
} else {
  // ups, Datei existiert nicht oder konnte
  // wegen den Zugriffsrechten nicht zum
  // lesen geöffnet werden.
  ...
}

Dann solltest du natürlich auch immer kontrollieren ob überhaupt sinnvolle Werte von der Datei eingelesen werden konnten:
Code:
if (fscanf (fp, "%f", &kurs ) == 1) {
  // fscanf gibt die Anzahl der erfolgreich
  // eingelesenen und zugewiesenen Elemente zurück.
  // wenn du 1 Element in eine Variable einlesen
  // willst, dann gibt die Funktion eben 1
  // zurück wenn das geklappt hat.
  ...
} else {
  // ups, evtl. sind wir schon am Ende der Datei, 
  // (EOF) angekommen (Datei ist leer?) oder in
  // der Datei stand keine Gleitkommazahl.
  ...
}

Wenn du eine Datei mit dem Modus "a" öffnest muß die Datei bereits existieren! Verwende "a+" wenn du möchtest das die Datei angelegt wird wenn sie noch nicht existiert.

:rtfm: Siehe die Dokumentation für die Funktionen fscanf und fopen

Übrigens, die solltest auch auf Fehler bei den Stream prüfen, anstatt nur auf EOF:
Code:
while (!feof (fp)) {
  if (fscanf (fp, ""%d \t %f",euroK,murK) == 2) {
    // euroK und murK konnten eingelesen werden!
  }
 
  if (ferror (fp)) {
    // irgendwas stimmt mit dem stream nicht!
    fputs("File error", stderr);
    break;
  }
}
 
okay mach ich mit diesem post dann!

Aber ich glaube nicht dass es am öffnen der Dateil liegt, denn er kann ja die wechselkurs.dat öffnen nur stürzt das programm erst beim auslesen der mur2eur.dat ab.
Ich hänge mal beide Dateien ran.

EDIT: kleiner Nachtrag, das Programm stürzt ab an der stelle dieses Codefragments (dick markiertes):


fp = fopen ("mur2eur.dat", "r");
fscanf(fp,"%d \t %f ",euroK,murK);
kleinstEuro = euroK = groesstEuro;
 

Anhänge

Zuletzt bearbeitet:
Ja, liegt nicht daran das das Öffnen nicht kontrollierst.

Aber in dem fscanf-Aufruf mußt du die Adressen der Variablen angeben wenn das selbst keine Pointer sind.
Code:
if (fscanf(fp,"%d \t %f", &euroK, &murK) == 2) {
   // ...
}
 
Schon die Antworten da... geht ja schnell.

Ja genau hast recht, das könnts sein.
Daran muss ich mich erst gewöhnen in C mit den Pointer und den Adressen und dem eigentlichen Inhalt der Variablen :)


EDIT: Da fällt mir ein, wieso kann man Pointer ohne dies & davor reinschreiben, aber normale Variablen nicht?
 
Zuletzt bearbeitet:
Razorhawk hat gesagt.:
Code:
#include <stdio.h>

int main()
{ float kurs,euro,anzUmtausch=1.0,kleinstEuro,groesstEuro,mittEuro=0.0,euroK,murK;
  int mur;

  
 printf("Bitte geben sie einen Geldbetrag in Mauritius-Rupie ein: \n");
 scanf("%d",&mur);
    
 FILE *fp;
 fp = fopen ("wechselkurs.dat", "r");
 fscanf(fp, "%f", &kurs );
 fclose ( fp );


%f erwarted einen Zeiger auf eine double-variable, Du gibts aber nur eine float rein. Damit überschreibt das Programm Speicher, was zu Abtürzen führen kann.
 
Zurück