Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it L'avatar di vi1985
    Registrato dal
    Dec 2006
    Messaggi
    34

    [C] Lettura di stringhe da file

    Salve a tutti e vivissimi complimenti per il portale.
    Leggendo le specifiche di un programma richiesto mi son imbattuto per la prima volta in una problematica riguardo la lettura di più stringhe da file.

    codice:
    *         carica da un file di testo un elenco di modelli di autovetture; per 
    *         ogni modello di autovettura le informazioni sono: marca, modello e
    *         prezzo 
    *         visualizza a video l'elenco caricato
    Il file (auto.txt) a cui la traccia fa riferimento è composto da:

    codice:
    3
    !Opel!Astra!18000.00!
    !Fiat!Punto!13500.00!
    !Audi!A4!32000.00!
    ...le cui specifiche sono:

    codice:
    *         il file di testo contentente l'elenco è strutturato come segue:
    *         la prima riga contiene un numero intero che rappresenta quanti record
    *         sono presenti nell'elenco salvato su file;
    *         su ogni riga c'è un record riportato secondo la seguente sintassi:
    *         !Campo_Marca!Campo_Modello!Campo_Prezzo!
    *         la dimensione massima dell'elenco gestito è pari a 100
    Quel che mi preme risolvere è la scrittura del sottoprogramma che legge il contenuto da file.
    Quel pò fatto fin ora è:

    codice:
    void load(char lista[], int *dim)
    {
       FILE *fp;
       /* apro il file */
       fp=fopen("auto.txt", "r");
       /* leggo la dimensione e la stampo come test*/
       fscanf(fp, "%d", dim);
       printf("%d", *dim);
    
       fclose(fp);
    }
    Qualcuno potrebbe aiutarmi a colmare questa lacuna?
    PS: Ho pensato ad un array di stringhe, ma non son riusito ad implementare correttamente il codice.

    Ringraziamenti anticipati anche solo per l'attenzione, vi.

  2. #2
    Ora che hai letto dal file il numero dei record presenti,
    prosegui con un ciclo alla lettura dei singoli record
    ( potresti usare la fgets() ) quindi dividi
    il record ad ogni ricorrenza del carattere separtore '!'
    (ad esempio con la strtok() ) .
    Se usi la fgetc(), puoi evitare di usare la strtok().
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  3. #3
    Utente di HTML.it L'avatar di vi1985
    Registrato dal
    Dec 2006
    Messaggi
    34
    Dovrei comunque implementare due cicli annidati, l uno che legge il numero del record ( for(i=0; i<*dim; i++) ), l altro i caratteri presenti in esso, giusto?
    In questo modo dovrei dichiarare la variabile lista come array di stringhe.

    Ho provato in questo modo e sembra ancora che non funzioni:
    codice:
    void load(char lista[][max_dim], int *dim)
    {
       FILE *fp;
       int i, j;
       fp=fopen("auto.txt", "r");
       fscanf(fp, "%d", dim);
       printf("%d", *dim);
       for(i=0; i<*dim; i++)
       {
          j=0;
          while(fscanf(fp, "%c", &lista[i][j])!='\n' && fscanf(fp, "%c", &lista[i][j])!=EOF)
          {
             fscanf(fp, "%c", &lista[i][j]);
             j++;
          }
       }
       fclose(fp);
    }
    Mi scuso per la tardività intuitiva su tali cose ma è la prima volta che mi trovo a gestire questa tipologia di esercizio.

  4. #4
    Utente di HTML.it L'avatar di vi1985
    Registrato dal
    Dec 2006
    Messaggi
    34
    Facendo ulteriori riflessioni sono giunto ad un codice più o meno buono.
    C'è però ancora un inconveniente fastidioso e riguarda lo spazio.

    Considerando il file auto.txt composto da:

    codice:
    3
    !Opel!Astra!18000.00!
    !Fiat!Punto!13500.00!
    !Alfa Romea!Brera!32000.00!
    Ed il codice:
    codice:
    void load(char lista[][max_dim], int *dim)
    {
       FILE *fp;
       int i, j;
       fp=fopen("auto.txt", "r");
       fscanf(fp, "%d", dim);
       printf("%d", *dim);
       for(i=0; i<*dim; i++)
       {
             fscanf(fp, "%s", &lista[i]);
       }
       fclose(fp);
       for(i=0; i<*dim; i++)
       {
             printf("%s\n", lista[i]);
       }
    }
    Il programma stampa:

    codice:
    !Opel!Astra!18000.00!
    !Fiat!Punto!13500.00!
    !Alfa
    
    Premere un tasto per continuare . . .
    Come posso risolvere l'errore annettendo all'array di stringhe anche il carattere di spazio?

  5. #5
    Lasciando perdere la fscanf....
    Ed utilizzando una delle funzioni che ti ho
    precedentemente suggerito io ?
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  6. #6
    Utente di HTML.it L'avatar di vi1985
    Registrato dal
    Dec 2006
    Messaggi
    34
    Tutto risolto!
    Nel caso servisse a qualcuno, posto qui di seguito il codice che ho scritto:

    codice:
    #define max_dim 100
    
    void load(char lista[][max_dim], int *dim)
    {
       FILE *fp;
       int i, j;
       char scarto[max_dim];
       fp=fopen("auto.txt", "r");
       fscanf(fp, "%d", dim);
       /* Scarto un '/n' */
       fgets(scarto, max_dim, fp);
       for(i=0; i<*dim; i++)
       {
             fgets(lista[i], max_dim, fp);
       }
       fclose(fp);
       for(i=0; i<*dim; i++)
       {
          j=0;
          while(lista[i][j]!='\n' && lista[i][j]!=EOF)
          {
             lista[i][j]=lista[i][j+1];
             if(lista[i][j]=='!')
                lista[i][j]=' ';
             j++;
          }
    
       }
    }

    Buona programmazione a tutti e grazie per l'aiuto !

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.