Probleme mit fscanf
-
Hey ihr alle!
Ich habe folgendes Problem mit der Funktion fscanf:
Ich muss aus einer Datei einzelne Zahlen auslesen und verarbeiten und habe dazu untenstehenden Code geschrieben. Mein Problem ist, dass dieser in den Testläufen mit relativ kleinen Dateien gut funktioniert.... Unter "Realbedingungen" (ca. 800 Zeilen mit 7 Einträgen) bleibt das Programm allerdings immer hängen oder stürzt ab. Ich hab schon rausgefunden, dass es wohl im Bereich der Funktion fscanf liegen muss. Leider bin ich nicht besonders bewandert in der tiefergehenden Implementierung der einzelnen Funktionen. Ich wäre Euch sehr dankbar, wenn jemand Rat wüsste!
Gruß Chrisint Einlesen(int *day1,int *day2,int *month1,int *month2,int *year1,int *year2,float *konz)
{
FILE *in;
char file_name[255];
int d1,d2,m1,m2,y1,y2,n=0;
float k;printf("... ");
scanf("%s",file_name);in= fopen(file_name, "r");
if(in==NULL)
{printf("Konnte %s nicht öffnen! \n", file_name);
exit(0);
}while((fscanf(in,"%i.%i.%i%,%i.%i.%i,%f",&d1,&m1,&y1,&d2,&m2,&y2,&k))!=0)
{ day1[n]=d1;
month1[n]=m1;
year1[n]=y1;
day2[n]=d2;
month2[n]=m2;
year2[n]=y2;
konz[n]=k;
n=n+1;
}
fclose(in);
return (n);
}
-
kannst du mal deine testdaten und auszugsweise deine realdaten posten.
spontan fällt mir nur auf, dass du das zeilenende nicht korrekt überliest, also am ende des fscanf aufrufs kein "\n" steht. das sollte allerdings nicht zum absturz führen, sondern nur dazu, dass alle werte nach der ersten zeile null sind.
-
Hallo,
danke...das mit dem Zeilenende hab ich schon ausprobiert!Meine "Realdaten" unterscheiden sich eigentlich nur dadurch, dass einstellige Zahlen mit einer Null angegeben sind (7 -> 07). Das sind allerdings scheinbar nicht die Stellen an denen das Programm hängen bleibt.
Testdaten:
3.4.1987,5.4.1987,342.1
5.4.1987,7.4.1987,223
7.4.1987,10.5.1987,111
10.5.1987,7.8.1987,33
7.8.1987,8.8.1987,288.1
10.5.1987,7.8.1987,33
....Realdaten:
11.02.1983,12.02.1983,1.38
12.02.1983,16.02.1983,0.87
16.02.1983,19.02.1983,0.56
19.02.1983,24.02.1983,0.82
24.02.1983,27.02.1983,0.48
06.03.1983,14.03.1983,0.937
14.03.1983,19.03.1983,0.754
01.04.1983,06.04.1983,0.67
22.04.1983,27.04.1983,0.522
05.05.1983,13.05.1983,0.759
25.05.1983,30.05.1983,1.351
04.06.1983,09.06.1983,0.962
.....Gruß
Chris
-
O.K...
Ich hab jetzt mal Test-Daten mit "Nullen" (7=07) erzeugt und scheinbar liegt es doch daran!
Gibt es eine Möglichkeit diese Null zu "überlesen"?Chris
-
Ja, die "07" dürften das Problem sein (besser gesagt - Werte wie "08"). %i wählt automatisch zwischen dezimaler, oktaler und hexadezimaler Eingabe aus, je nachdem, womit die Eingabedaten beginnen - alles mit 0 am Anfang zählt als Oktal und da sind die Ziffern 8 und 9 nicht erlaubt.
Einfachste Lösung: Ändere die ganzen %i Einträge in deinem Formatstring um in %d - das liest immer dezimal ein.
@ghorst: Die Zeilenenden dürften kein Problem sein - fscanf überliest whitespaces in der Eingabe.
-
Alles klar jetzt funktioniert es!!
VIELEN DANK!!