Hallo, ich möchte aus einer Textdatei Zeile für Zeile auslesen und mit einem vogegeben Wert code und datum vergleichen. Das klappt ganz gut, da ich einfach einen couter i nach jeder ausgelesenen Zeile hochzählen lasse und wenn er bei 20 ist, bricht er die schleife ab. Das Problem ist, dass ich es nicht schaffe, dass er am ende der Datei selbst aufhört. Da ich irgendwann mehr als 20 Einträge habe findet wer dann die letzten nicht mehr. Stelle ich den Schleifenabbruch i auf 1000, dauert es jedesmal ewig.... Wie kann ich die schleife abbrechen wenn er am Ende einer Datei ist? in der Datei time.csv steht: // Datum;code;kommen;Uhrzeit 31.03.16;2485790;KOMMEN;16:07 31.03.16;2501230;KOMMEN;16:23 ///// Datei früher für eine andere Operation schon mal initialisert und wieder geschlossen ... SdFile daten("time.csv", O_APPEND | O_WRITE); ... daten.close(); ... ///// Datei für Verleich neu geöffnet daten.open("time.csv", O_READ); //************************************************** char line[60]; int i = 0; int c; uint32_t pos; char* datum = date; char* zeit = time; int gefunden = 0; daten.rewind(); while (1) { pos = daten.curPosition(); if (daten.fgets(line, sizeof(line)) < 0) { Serial.println("Line not found"); } char cp[8]; char dat[8]; sprintf(cp,"%ld",code); Serial.print("i = "); Serial.print(i); Serial.print(" / "); Serial.write("**Line: "); Serial.print(line); Serial.print(" / "); if (strstr(line,datum) && strstr(line,cp)) { Serial.print("**Datum vorhanden: "); Serial.print(datum); Serial.print(" / "); Serial.print("**Code auch voranden: "); Serial.print(line); Serial.print(cp); Serial.print("------Alles OK----- "); gefunden = 1; break; } if (strstr(line,datum) && !strstr(line,cp)) { Serial.print(">> Nur Datum in Time.csv vorhanden: "); Serial.print(line); Serial.print(" / "); Serial.print(datum); } if (!strstr(line,datum) && !strstr(line,cp)) { Serial.print(">> Weder Datum noch code vorhanden: "); Serial.print(line); Serial.print(" / "); Serial.print(datum); } i++; if (i>=20) break; Serial.print(" / Ende"); Serial.println(); } daten.close();
Schon mal in der Doku der Klasse nach einer EOF (end of file) Funktion gesucht?
> if (daten.fgets(line, sizeof(line)) < 0) {
Bist du sicher das da ein negativer Wert zurück kommt
wenn keine Daten mehr da sind? Eine Null würde es auch tun.
MartinK schrieb: > Ja hab aber nix gefunden. Ich auch nicht. Ich weiss nicht mal, welche Library du benutzt. Mich wundert, dass dein Code so überhaupt durch den Compiler geht.
Ich benutze die SDFat.h habs jetzt so gelöst. Funzt einwandfrei.... SdFile daten("time.csv", O_READ); while ((c = daten.read()) >= 0) { pos = daten.curPosition(); daten.seekSet(pos-1); if (daten.fgets(line, sizeof(line)) < 0) { Serial.print("Line not found"); } Serial.print("Testausgabe"); Serial.print(line); }
Und warum so umständlich? Ist es so schwer, das Handbuch zu lesen? Aus der Doku von SdBaseFile::fgets(): Returns: For success fgets() returns the length of the string in str. If no data is read, fgets() returns zero for EOF or -1 if an error occurred.
Rolf M. schrieb: > Ist es so schwer, das Handbuch zu lesen? O-Ton eines mir bekannten Entwicklers: "Das ist mir zu anstrengend, fünftausend Seiten Dokumentation zu lesen"
Rufus Τ. F. schrieb: > "Das ist mir zu anstrengend, fünftausend Seiten Dokumentation zu lesen" Das Lexikon lernt man wegen eines einzelnen Artikels auch nicht auswendig. Da kann dein Entwickler noch was lernen.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.