Forum: Mikrocontroller und Digitale Elektronik fatfs und fscanf bei MSP430


von Hans-Jörg (Gast)


Lesenswert?

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?

von asd (Gast)


Lesenswert?

Vermutlich nicht die eleganteste Lösung, aber kopier das Zeug erst ins 
RAM, dann nimm sscanf().

von Karl H. (kbuchegg)


Lesenswert?

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.

von Hans-Jörg (Gast)


Lesenswert?

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!

von Karl H. (kbuchegg)


Lesenswert?

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.

von Hans-Jörg (Gast)


Lesenswert?

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