Problem SDfat - Ende der Datei finden

Gast #4528320
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();
Gast #4528584
> 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.
Gast #4529042
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);

    }
#4529076
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.