Aus Datei daten in Struktur einlesen
-
so mein Kram funktioniert jetzt
ist sicher noch verbesserungsfähig
Hier mal die gesammte funktionint AusDateiLesen(struct Wahren* Artikel, int *anz){ int i=0,dumpint=0; FILE *datei; char dumpchar[100]; char zeile[100]; strcpy(zeile,"5"); datei = fopen ("Datendatei.txt", "r"); if (datei == NULL){ printf("Fehler beim oeffnen der Datei."); return 1; } if (datei != NULL) { fscanf(datei,"%99s%s%99s%99s%99s",dumpchar,dumpchar,dumpchar,dumpchar,dumpchar); //strcpy(dumpchar,"TEST"); /* Schleife lauft so lange wie Zeilen aus Datei Ausgelesen werden*/ while (fgets(zeile,100,datei)){ /*fscanf liefert die anzahl der Richtig gelesenen Formatspezifizierer an *zeile */ *zeile==fscanf(datei,"%d %d %99s %99s %lf",&dumpint,&Artikel[i].nr,Artikel[i].bezeichnung,Artikel[i].name,&Artikel[i].preis); i++; } fclose (datei); } i--;// minus 1 wegen Richtiger Anzahl *anz=i;// Zuweisung der Anzahl ausgelesener zeilen in die wichtige Zaelvariable anz, return 0; }
-
So werden die Werte aber nur aus jeder zweiten Zeile genommen.
Lies es die nochmal genau durch:Wutz schrieb:
Außerdem war mein Vorschlag fgets+sscanf und nicht fscanf,
-
Warum in Zeile 11 kein else?
Zeile 19 verstehe ich nicht?Nur für die Optik - Waren oder Wahren?
-
DirkB schrieb:
So werden die Werte aber nur aus jeder zweiten Zeile genommen.
Ich nehme das mit der zweiten Zeile zurück.
Mit dem fgets liest du nur noch den Rest der Zeile ein, den fscanf übrig gelassen hat. Und wenn es nur das '\n' ist.
Trotzdem war es so nicht gemeint.
-
Was war so nicht gemeint? das verwirrt mich etwas
ich bin jedenfalls erst mal zufrieden mit meinem Code, er liefert das was ich haben möchte.
Obwohl ich selber zugeben muss das mir nicht alles hundert prozentig klar ist was mein Code genau macht.Ich versuche das mal zu beschreiben.
hier lese ich die Zeile mit den Tabellenköpfen ein, diese Zeile wird verworfen.
Position in der Datei ist jetzt noch Zeile1.fscanf(datei,"%99s%s%99s%99s%99s",dumpchar,dumpchar,dumpchar,dumpchar,dumpchar);
while (fgets(zeile,100,datei)){ /*fscanf liefert die anzahl der Richtig gelesenen Formatspezifizierer an *zeile */ *zeile==fscanf(datei,"%d %d %99s %99s %lf",&dumpint,&Artikel[i].nr,Artikel[i].bezeichnung,Artikel[i].name,&Artikel[i].preis); i++; }
Die Schleife läuft solange wie fgets(zeile,100,datei)einen Wahren wert leifert.
Wert von zeile ist 5,
Durch fgets wird nun das Return am Ende von Zeile1 in zeile gespeichert. Position in der Datei ist jetzt Anfang Zeile2
danach wird fscanf ausgeführt, diese liest mit hilfe der Formatspezifizierer die Zeile aus und weist die gefundenen Zeichenketten dem Strukturarray zu.
Der Rückgabewert von fscanf sind die Anzahl der richtig ausgelesenen Formatspezifizierer. das sind hier 5.
i wird erhöt um 1 und wir landen wider bei der Prüfung der Wihle bedingung.
damit sind wir wieder an der Stelle wo in Zeile2 das Return am Ende Steht.Wenn jetzt die letzte Zeile eingelesen wurde liefert fscanf eine 0 an zeile und die Prüfung der while Bedingung ergibt einen Fehler, weil da kein Zeichen mehr kommt. damit wird die Bedingung falsch und die while Schleife wird verlassen.
Was meint ihr? ist das halbwegs richtig
-
Okay in Zeile 6 kopierst du "5" in zeile.
In Zeile 17 wird der Inhalt von zeile geändert, oder nicht
Welche Auswirkung oder Zweck soll der Vergleichsoperator == in Zeile 19 haben?
Sehe da kein if, while oder ähnliches?
-
RajHid schrieb:
Was war so nicht gemeint? das verwirrt mich etwas
Du liest mit Zeile 14 (
fscanf(datei,"%99s%s%99s%99s%99s",dumpchar,dumpchar,dumpchar,dumpchar,dumpchar);
) die Überschriften ein.
Das '\n' aus der Zeile bleibt aber noch im Eingabepuffer.Das wird dann in Zeile 17 (
while (fgets(zeile,100,datei))
) ausgelesen.
In Zeile 19 liest du dann die Werte aus der nächsten Zeile (bis auf das '\n').
Das wird dann in Zeile 17 ...
Geh mal mit dem Debugger schrittweise durch.Gemeint war, die komplette Zeilen mit fgets auslesen und mit sscanf auswerten:
fgets(zeile,100,datei) // Überschrift lesen Reichen 100 ZEichen aus? /* Schleife lauft so lange wie Zeilen aus Datei Ausgelesen werden*/ while (fgets(zeile,100,datei)){ /*sscanf liefert die Anzahl der richtig gelesenen Formatspezifizierer zurück */ if (5!=sscanf(zeile,"%d %d %99s %99s %lf",&dumpint,&Artikel[i].nr,Artikel[i].bezeichnung,Artikel[i].name,&Artikel[i].preis)) { Fehler, Was jetzt? }; i++; }
-
Nen Debugger benutze ich nicht ich mach das nur mit Konsole und vim
Ist halt manchmal etwas schwieriger.Über die Funktion muss ich aber noch mal drüber schauen da sind noch Ungereimtheiten drin.
-
RajHid schrieb:
Nen Debugger benutze ich nicht ich mach das nur mit Konsole und vim
Ist halt manchmal etwas schwieriger.Fuer den Debugger brauchst du auch nur die Konsole.
Und der ist auch schon dabei.gdb
-
Hab mir mal gdb angeschaut, hätte ich schon eher verwenden sollen hätte mir manches an Zeit erspart. Danke für den Hinweis.