Zeile aus Datei lesen in Schleife - Problem: Datei wird nach x Schleifendurchgängen nicht richtig gelesen?!
-
Hallo,
ich habe mir ein kleines C-Programm geschrieben, dass aus einer Datei zwei bestimmte Werte aus zwei verschiedenen Zeilen liest und dann eine einfache Rechenoperation mit diesen ausführt.
Das Programm funktioniert auch nach meinen Vorstellungen, bis es aber ab einem bestimmten Punkt die Daten nicht mehr richtig ausliest, oder sie nicht mehr korrekt in die dafür angelegten Variablen abspeichert. Ich habe die Vermutung, dass es irgendeine Art Segmentation Fault. Wie gesagt funktioniert das Programm vorerst bei mir, jedoch hat es mir sofort einen segfault ausgespuckt, als ich es auf einem anderem Rechner auszuführen versuchte.
Damit die Funktionsweise des Programms deutlicher wird, gebe ich erstmal ein Beispiel der auszulesenden Datei und gebe dann auch den Quellcode meines Programms an:Ich hoffe dieses Beispiel der auszulesenden Datei ist verständlich:
15 -1.000000 y1 15 -0.999000 y2 ... 15 0.999000 ya 15 1.000000 yb 16 -1.000000 yc ... 16 1.000000 yd 17 ... ... 18 ... ...
Der Quellcode meines Programms:
#include <stdio.h> int main() { const double XRNG=1, XINCR=0.001; const int NMIN=14, NMAX=17; long double sigma; double x, xone, xtwo, yone, ytwo, oodelta=0.300; int None, Ntwo, N; FILE *dev_ptr; dev_ptr = fopen("SIGMAoveroodelta.gpd", "w"); FILE *oodelta_ptr; oodelta_ptr = fopen("./oodelta/oodelta=0.300.gpd", "r"); sigma=0; for(N=NMIN+1; N<=NMAX; N++) { for(x=-XRNG; x<=XRNG; x+=XINCR) { rewind(oodelta_ptr); while( !((xone==x) && (None==N)) ) { fscanf(oodelta_ptr, "%i %lf %lf", &None, &xone, &yone); } while(fgets(str_buf, MAX_LEN+1, oodelta_ptr) != NULL) { fscanf(oodelta_ptr, "%i %lf %lf", &Ntwo, &xtwo, &ytwo); printf("\rxtwo = %f", xtwo); if( (xtwo==x) ) { sigma+=(yone-ytwo)*(yone-ytwo); printf("x = %f\tN = %i\nxone = %f\tNone = %i\n", x, N, xone, None); printf("xtwo = %f\tNtwo = %i\nsigma = %Lf\n", xtwo, Ntwo, sigma); } } } } fprintf(dev_ptr, "%f %Lf\n", oodelta, sigma); }
Ich versuche das Problem noch ein bisschen genauer einzukreisen:
Ab einem bestimmten Wert von x ( hier: -0.937000 ) liest die "xone-Schleife" diesen besagten Wert vermutlich nicht mehr richtig ein und läuft dann schließlich bis zum EOF. Da gleiche gilt, denke ich, auch für die "xtwo-Schleife".
Woran kann dies liegen? Kann mir jemand helfen?MfG,
Gill
-
Gill schrieb:
Ab einem bestimmten Wert von x ( hier: -0.937000 ) liest die "xone-Schleife" diesen besagten Wert vermutlich nicht mehr richtig ein und läuft dann schließlich bis zum EOF.
Du hast die Designschwäche deiner Implementierung richtig erkannt.
Mit fscanf verbindest du unnötigerweise Dateioperation und Datenauswertung miteinander. Deshalb besser, lese mit fgets ein, werte mit sscanf (inkl. des Rückgabewertes!) aus.
-
Hallo.
Vielen Dank erstmal Wutz für die Antwort.Ich habe die beiden Zeilen
fscanf(oodelta_ptr, "%i %lf %lf", &None, &xone, &yone); bzw. fscanf(oodelta_ptr, "%i %lf %lf", &Ntwo, &xtwo, &ytwo);
geändert zu:
fgets(str_buf, MAX_LEN+1, oodelta_ptr); sscanf(str_buf, "%i %lf %lf\n", &None, &xone, &yone); bzw. fgets(str_buf, MAX_LEN+1, oodelta_ptr); sscanf(str_buf, "%i %lf %lf", &Ntwo, &xtwo, &ytwo);
Ich habe auch ein bisschen mit den Rückgabewerten und puts(str_buf) rumgespielt und herausgefunden, dass abwechselnd ein Zeile aus meiner Datei und eine leere Zeile ausgelesen werden (Rückgaberwerte 3 bzw. -1). In der Datei stehen jedoch keine leere Zeilen.
Das Problem besteht also leider immer noch. Ab dem schon genannten Wert liest das Programm nicht mehr korrekt die Werte aus der Datei aus.
Hilfe!
-
Könnte sein, dass dein MAX_LEN zu gering dimensioniert ist und fgets nicht bis '\n' liest und das '\n' erst beim nächsten Aufruf gelesen wird, was die Leerzeile erklären würde.