fatfs und fscanf bei MSP430

Gast #2370625
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?
Gast #2371507
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!
#2371516
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren