Forum: Compiler & IDEs Problem SDfat - Ende der Datei finden


von MartinK (Gast)


Lesenswert?

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();

von Falk B. (falk)


Lesenswert?

Schon mal in der Doku der Klasse nach einer EOF (end of file) Funktion 
gesucht?

von MartinK (Gast)


Lesenswert?

Ja hab aber nix gefunden.

von Falk B. (falk)


Lesenswert?

Wo ist deine Doku zu finden?

von holger (Gast)


Lesenswert?

> 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.

von Forist (Gast)


Lesenswert?

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.

von MartinK (Gast)


Lesenswert?

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);

    }

von Rolf M. (rmagnus)


Lesenswert?

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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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"

von W.A. (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.