Problemi con la lettura di un file

di Ste Bra il
6 risposte
Salve,
ho il problema che non mi legge come desidero le linee di un file;
la porzione di codice è la seguente:

struct Articolo {
    char codice[4];
    char nome[30];
    char tipo;
    float prezzo;
    int num_prodotti;
};

/* ... */

int i = 0;
while(fscanf(fp, "%s %s %c %f %d", codice, nome, &tipo, &prezzo, &num_prodotti)>0) {
        strcpy(articoli[i].codice, codice);
        strcpy(articoli[i].nome, nome);
        articoli[i].tipo = tipo;
        articoli[i].prezzo = prezzo;
        articoli[i].num_prodotti = num_prodotti;
        i++;
}
il file da cui vado a leggere contiene:

S000 ScarpeCalcio S 150.0 4
S001 PalloneBasket S 55.5 2
S004 MazzaBaseball S 250.0 6
...
e se eseguo un output di prova, mi restituisce questo:

(S000ScarpeCalcio, ScarpeCalcio, S, 150.000000, 4)
(S001PalloneBasket, PalloneBasket, S, 55.500000, 2)
(S004MazzaBaseball, MazzaBaseball, S, 250.000000, 6)
ho provato una stupidaggine, con "memcpy" per prendere solo i primi 4 caratteri del primo campo, ma non funge...

Sospetto che l'errore sia nel "fscanf" ma non saprei come risolvere.
Ho provato in vari modi, ma non cambia nulla.
Qualcuno saprebbe dirmi cosa sto sbagliando?

PS: il codice deve essere specificatamente in C (no C++).

6 Risposte

  • Le stringhe da quattro caratteri sono lunghe cinque byte. Alcune funzioni non terminano finché non trovano appunto il terminatore (byte zero)
  • Questo è chiaro, ma... non ho la minima idea di come potrei fare a risolvere...
    qualche consiglio?
  • Prova ad aumentare la dimensione di codice per fare posto al terminatore
  • Oh... funge...
    grazie mille

    Ma quindi... per evitare il problema anche negli altri campi delle stringe, dovrei aumentare tutte le lunghezze di uno?
  • Ma non è un problema, è così che funziona. Il terminatore lo scriveva nel primo byte di nome e poi veniva sovrascritto
    Metti un buffer adeguato come hai fatto con nome. Abbonda pure, non ci sono più i problemi di memoria del passato
  • Ottimo, grazie mille dei tuo tempo.
Devi accedere o registrarti per scrivere nel forum
6 risposte