Hallo, habe ein Problem mit FatFs und fscanf. Es geht darum das beide unterschiedliche Dateitdeklarierungen verlangen, FIL bei den FatFs Funktionen und FILE bei den normalen Funktionen. Jetzt möchte ich allerdings eine Textdatei auslesen und den entsprechenden String in einzelne Variablen übergeben. Dies möglichst mit fscanf. Mein Code bisher sieht so aus: char speicher[82]; char clock_hour[2]; char clock_min[2]; char clock_day[2]; char clock_mon[2]; char clock_year[4]; char name[40]; char modus[1]; char intervall[6]; char start_hour[2]; char start_min[2]; char start_day[2]; char start_mon[2]; char start_year[4]; char end_hour[2]; char end_min[2]; char end_day[2]; char end_mon[2]; char end_year[4]; // Function Prototypes void ClearTempData(void); void die(FRESULT rc); void load() { FATFS fatfs; /* Work area (file system object) for drives */ FIL CONFIG; /* file objects */ FRESULT rc; /* FatFs function common result code */ UINT tr; // Register volume work area (never fails) f_mount(0, &fatfs); // Open file config.txt: rc = f_open(&CONFIG, "config.txt", FA_READ); for (;;) { rc = f_read(&CONFIG, speicher, sizeof(speicher), &tr); /* Read a chunk of file */ if (rc || !tr) break; /* Error or end of file */ } if (rc) { f_close(&config); die(rc); } f_close(&config); f_mount(0, NULL); ClearTempData(); // Stringbearbeitung fscanf(&CONFIG,"%s*%s*%s*%s*%s*%s*%s*%s*%s*%s*%s*%s*%s*%s*%s*%s*%s*%s\n" , &clock_hour,&clock_min,&clock_day, &clock_mon, &clock_year, &name, &modus, &intervall, &start_hour, &start_min, &start_day, &start_mon, &start_year, &end_hour, &end_min, &end_day, &end_mon, &end_year); ---------------------------------------------------- jetzt meine Frage gibt es da irgendeine Möglichkeit das doch hinzubekommen? Zum Beispiel über öffnen einer neuen temporären Datei mit fopen() in welche der String Speicher geschrieben wird und dann von fscanf() ausgelesen wird. Oder gibt es eine einfachere und kürzere Lösung?
Vermutlich nicht die eleganteste Lösung, aber kopier das Zeug erst ins RAM, dann nimm sscanf().
Vergiss fscanf. Das bringt dich nicht weiter, weil es nicht in das Filesystem integriert ist, dass du tatsächlich benutzt. Du kannst nur Dinge benutzen, die mit f_ anfangen. Zb f_gets um eine Zeile zu lesen und die danach mit sscanf zerlegen.
Vielen Dank für die Antworten! Hab es jetzt mit f_gets, sscanf und f_printf gelöst. Jetzt habe ich noch eine Frage, und zwar ist es möglich das sscanf die Leerzeichen nicht beachtet? Eine meiner Variablen besitzt unter Umständen ein Leerzeichen, sscanf zeigt mir dann in der Variablen jedoch nur den Teil vor dem Leerzeichen. Gibt es da eine Möglichkeit? Mein sscanf sieht so aus: . . . char speicher[100]; char clock_hour[2]; char clock_min[2]; char clock_day[2]; char clock_mon[2]; char clock_year[4]; char name[40]; char modus[1]; char intervall[6]; char start_hour[2]; char start_min[2]; char start_day[2]; char start_mon[2]; char start_year[4]; char end_hour[2]; char end_min[2]; char end_day[2]; char end_mon[2]; char end_year[4]; . . . . // Open file config.txt: rc = f_open(&config, "config.txt", FA_READ); . . . . f_gets(speicher, 100, &config); . . . . // Stringbearbeitung sscanf(speicher, "%s_%s_%s_%s_%s_%s_%s_%s_%s_%s_%s_%s_%s_%s_%s_%s_%s_%s", &clock_hour,&clock_min,&clock_day,&clock_mon,&clock_year,&name, &modus,&intervall,&start_hour,&start_min,&start_day,&start_mon, &start_year,&end_hour,&end_min,&end_day,&end_mon,&end_year); . . . Hat jemand eine Idee oder habe ich einfach nur irgendwo einen Fehler gemacht? Nochmal vielen Dank für die Unterstüzung!
Hans-Jörg schrieb: > Vielen Dank für die Antworten! > > Hab es jetzt mit f_gets, sscanf und f_printf gelöst. Jetzt habe ich noch > eine Frage, und zwar ist es möglich das sscanf die Leerzeichen nicht > beachtet? Eine meiner Variablen besitzt unter Umständen ein Leerzeichen, > sscanf zeigt mir dann in der Variablen jedoch nur den Teil vor dem > Leerzeichen. Gibt es da eine Möglichkeit? sscanf kann auch regular expressions im Formatstring. Ich gestehe allerdings, dass ich da eine Wissenslücke habe. Das liegt daran, dass ich solche Sachen meistens nicht scanf mache, weil es in der Fehlerbehandlung eher unflexibel ist. Ausser der Information: Alle Argumente konnten ausgewertet werden, ist bei scnaf nichts zu holen und das reicht nun mal nicht, wenn man dem Benutzer genauer mitteilen will, dass er im 5. Argument in der Zahl einen Fehler hatte und ein wenig genauer auf diesen Fehler eingehen will. Daher zerlege ich solche Dinge meistens entweder mit einem eigenen Scanner oder mit strtok um dann die Einzelstrings mittels atoi oder dtostrf oder was dann eben gebraucht wird in die tatsächliche interne Form zu überführen. Leerzeichen als Bedeutung tragendes Zeichen zu verwenden ist IMHO sowieso meistens eine schlechte Idee. Whitespace Zeichen sind bei mir ausschliesslich immer als Trenner eingesetzt. Das gibt einfach am wenigsten Probleme, wenn Menschen die Eingabedaten erstellen oder kontrollieren müssen.
Mhm...okay dann versuch ichs auchmal mit strtok ich meine auch hier im Forum mal ein Beispiel hierzu gesehen zu haben wie GPS-Strings zerlegt wurden. Wir schon hinhauen! Dennoch vielen Danke!
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.