Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2015
    Messaggi
    4

    [C] Leggere dati da file di testo in una struct

    Ciao scusa se ti faccio una domanda ma ho più o meno lo stesso prob.

    Allora dovrei caricare/scrivere una struttura dati da/su file stream con formato di tipo stringa.
    Tale formato è stato scelto perchè devo poter visualizzare i dati scritti ed inoltre non ho mai usato fwrite e fread (ma a questo ovviavo tranquillamente ).
    Avevo pensato di farlo in questo modo:

    codice:
    struct info{
        char club[MAXCHAR];
        int np;
        int quote;
    };
    typedef struct info TInfo;
    
    struct elenco{
        
        int dim_fis;
        int dim_log;
        TInfo *v;
        
    };
    typedef struct elenco TElenco;
    
    int main(){
        
        TElenco *ele;
        etc. }
    
    void Salvataggio(TInfo *v, int dim) {
        
        int i;
        FILE *f;
        char str[MAXCHAR]="Elenco.txt";  //Presuppongo il file nella stessa cartella.
        
         f=fopen(str, "w");
         
         for(i=0; i<dim; i++){
             fprintf(f, "%s \t", v[i].club);
             fprintf(f, "%d \t", v[i].np);
             fprintf(f, "%d \n", v[i].quote);
         }
               
         fclose(f);
    
    }
    
    int Caricamento(TElenco *ele){
        
        // dim_log è a 0;
        
       
        FILE *f;
        char str[MAXCHAR]="Elenco.txt";
        
        f=fopen(str, "r");
        if(f==NULL)
           return -1;
                     
       
         while((fscanf(f, "%s", ele->v[ele->dim_log].club) && fscanf(f, "%s", ele->v[ele->dim_log].np) && fscanf(f, "%s", ele->v[ele->dim_log].quote))!= EOF)
           ele->dim_log++;
                     
        fclose(f);
                     
        return 1;
    }
    Vorrei sapere se si può fare non avendo modo di compilarlo ancora in particolare l'uso della 'fscanf'.

    Grazie anticipatamente per la risposta.
    Ultima modifica di NeoX.; 25-06-2015 a 11:46

  2. #2
    Utente di HTML.it
    Registrato dal
    Jun 2015
    Messaggi
    4
    Raga non esiste una soluzione quindi?

  3. #3
    Sposto il tuo post in una discussione separata, che sennò qui non si capisce niente.
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4
    1. Le fprintf si possono condensare in una sola:
    codice:
             fprintf(f, "%s\t%d\t%d\n", v[i].club, v[i].np, v[i].quote);
    2. Lo stesso vale per le fscanf, e in più così come sono sono tutte sbagliate, dato che usi (a) %s anche quando devi leggere interi e (b) ci devi passare un puntatore alle locazioni in cui leggere.

    In ogni caso, entrambe le questioni ti sarebbero più chiare leggendo i primi capitoli di qualunque libro di C, dove l'uso di scanf/printf è spiegato in maniera più completa.
    Ultima modifica di MItaly; 27-06-2015 a 20:41
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2015
    Messaggi
    4
    Quote Originariamente inviata da MItaly Visualizza il messaggio
    1. Le fprintf si possono condensare in una sola:
    codice:
             fprintf(f, "%s\t%d\t%d\n", v[i].club, v[i].np, v[i].quote);
    2. Lo stesso vale per le fscanf, e in più così come sono sono tutte sbagliate, dato che usi (a) %s anche quando devi leggere interi e (b) ci devi passare un puntatore alle locazioni in cui leggere.

    In ogni caso, entrambe le questioni ti sarebbero più chiare leggendo i primi capitoli di qualunque libro di C, dove l'uso di scanf/printf è spiegato in maniera più completa.
    Per prima cosa ti rigranzio molto per la tua risposta.

    Detto questo si avevo notato il mio errore dovuto al copia e incolla ma cmq non funziona scrivendo il codice in questo modo:

    codice:
      while((fscanf(f, "%s", ele->v[ele->dim_log].club)  &&  fscanf(f, "%d", ele->v[ele->dim_log].np) &&  fscanf(f,  "%d", ele->v[ele->dim_log].quote))!= EOF)
           ele->dim_log++;
    Inoltre modificando in questo modo il codice:

    codice:
    while((fscanf(f,  "%s,%d,%d", ele->v[ele->dim_log].club,   ele->v[ele->dim_log].np, ele->v[ele->dim_log].quote))!=  EOF)
           ele->dim_log++;
    ma mi da questo output inserendo 2 struct:

    codice:
    CLUB     PARTECIPANTI      QUOTE                                                                                                          
    jhy      4        105                                                                                                                    
    fdss     35       1190                                                                                                                   
    fdss     0        0                                                                                                                      
    35       0        0                                                                                                                      
    1190     0        0                                                                                                                      
    jhy      0        0                                                                                                                      
    4        0        0                                                                                                                      
    105      0       0
    mentre quello desiderato sarebbe:

    codice:
    CLUB    PARTECIPANTI      QUOTE                                                                                                          
    jhy      4        105                                                                                                                    
    fdss     35       1190
    Da quel che so, la fscanf non dovrebbe puntare spostarsi automaticamente all'ultimo campo inserito?

    Per il puntatore invece, non glielo passo già con f?

    Inoltre se posso chiederti una chicca, come posso mettere l'equivalente della system pause su linux?

    Grazie di nuovo infinitamente.

  6. #6
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    codice:
    "%s,%d,%d"
    Qui ci sono degli errori.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  7. #7
    Utente di HTML.it
    Registrato dal
    Jun 2015
    Messaggi
    4
    Quote Originariamente inviata da Scara95 Visualizza il messaggio
    codice:
    "%s,%d,%d"
    Qui ci sono degli errori.
    Grazie della risposta ma come posso risolverlo?

    Inoltre ho anche un problema con getchar che non mi viene riconosciuto da netbeans, poichè non si ferma nemmeno a per ricevere l'input provando con tali codici;

    codice:
    printf("\nPremere un tasto per Continuare...\n");
                        fflush(stdin);
                        scanf("%c", &p);
                        break;
    codice:
    printf("\nPremere un tasto per Continuare...\n");
                        fflush(stdin);
                        p=getchar();
                        break;
    codice:
    printf("\nPremere un tasto per Continuare...\n");
                        fflush(stdin);
                        while (getchar() != '\n');
                        break;
    E' come se passasse direttamente al break;

    Come posso ovviare a tali problematiche?

    Grazie ancora anticipatamente
    Ultima modifica di NeoX.; 29-06-2015 a 13:32

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 © 2024 vBulletin Solutions, Inc. All rights reserved.