Lettura FILE -> array di righe...

di il
3 risposte

Lettura FILE -> array di righe...

(il linguaggio con cui sto litigando è il C, in ambiente UNIX)

Ciao ragazzi, il mio problema è il seguente:
sto cercando di scrivere una funzione che legga il contenuto di un file e lo inserisca in un array di stringhe (venendo dal Java, la parola 'stringhe' mi sta facendo impazzire).

Quindi ho pensato a una cosa tipo:

int acquisisciFile ( char *nomeFileAcquisire, pack *mexxx[] )

laddove il pack è:
typedef struct pacchetto{
    
    int numeroPacchetto;
    char contenuto[2000];
}pack;
Ho scelto di usare una struct per tenere conto del numero relativo ad ogni riga in cui è stato diviso il file e poterlo riordinare, in vista del fatto che poi dovrò mettere 'righe' aggiuntive...

Quindi, creo un array di pack:
pack messaggio[numeroRighe];
con il corretto numero di righe, e fin qui, nessun problema.
Poi passo alla funzione il puntatore a questo array in modo da farle modificare direttamente l'array di mio interesse.
Ma, ragazzi, proprio non funziona!!
Cosa pensate che stia sbagliando!?
Non mi da nessun errore di compilazione, ma l'array è vuoto!
int acquisisciFile ( char *nomeFileAcquisire, pack *mexxx[] ){
 
    pack mex;

    FILE *fpA;
    
    if ( !( fpA = fopen( nomeFileAcquisire, "r" ) ) ) {  // Prova ad aprire il file.
        printf("Errore in apertura");
        return 1;
    }
    printf( "File aperto \n" );
    
    int contatore = 0;
    while ( 1 ){
        mex.numeroPacchetto = contatore;
        fgets( mex.contenuto, 2000, fpA );
        if ( feof( fpA ) ) break;
        
        int puntatore = (int) &mex;
        mexxx[contatore] = puntatore;
        
 
        contatore ++;
    }
 
    
    fclose( fpA );
    
    return 0;
}

3 Risposte

  • Re: Lettura FILE -> array di righe...

    
    pack mex;
    ...............
    int puntatore = (int) &mex;
    mexxx[contatore] = puntatore;
    
    prima perche usi il cast su int qunado non è neccessario.basterebbe
    
    mexxx[contatore] = &mex;
    
    ma non funzionerebbe perche mex è locale e la copia si distrugge all'uscita dalla funzione. Dovresti copiare i campi della struttura uno ad uno.
  • Re: Lettura FILE -> array di righe...

    Circa il cast su int, hai ragione, infatti la stesura iniziale del codice era come la tua.
    Poi come tentativo estremo ho messo in piedi quella cosa che mi sono scordato di togliere.

    Effettivamente non avevo pensato al fatto che, in quanto variabile locale, all'uscita dalla funzione si distrugge, lasciando il mio array puntare a campi di memoria non più occupati (da quello che mi aspetto, almeno).

    Ora provo con la copia dei campi uno ad uno.

    GRAZIEEEEE !!!!
  • Re: Lettura FILE -> array di righe...

    Ora capisco perché odiavo il C....

    Premesso che l'array che passo alla funzione è dichiarato così:
    pack messaggio[numeroRighe];
    ora ottengo un bel segmentation fault !!! quando tento di:
     //int puntatore = (int) &mex;
            //mexxx[contatore] = puntatore;
            
            mexxx[contatore]->numeroPacchetto = mex.numeroPacchetto;
            
            strcpy( mexxx[contatore]->contenuto, mex.contenuto );
    Quale potrebbe essere il problema?
    Un array dichiarato va inizializzato prima di essere usato?
Devi accedere o registrarti per scrivere nel forum
3 risposte