Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Lettura da file e array
Forum - C/C++ - Lettura da file e array

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
radeon (Normal User)
Newbie


Messaggi: 6
Iscritto: 12/05/2008

Segnala al moderatore
Postato alle 21:30
Lunedì, 12/05/2008
Salve a tutti, questo è il mio 1° post. Sono diversi anni che non programmo in C (sono molto arrugginito) e spero di essere il + chiaro possibile. L'input del problema consiste in un file di testo nel quale sono presenti una o + coppie di interi "n" e "k". "n" indica il numero di elemeti da inserire nell'array, mentre "k" indica il range del valore (-k..k) che gli "n" elementi possono assumere. La cosa che non riesco a capire è come far "pescare" "n" e "k" dal file per poi costruire l'array. Per ora ho fatto la lettura file nel seguente modo:

int main(int argc, char **argv)
{    
    int n, k;
    FILE *Fp1;
    
    Fp1 = fopen(NOME_FILE, "r");
    
    if (Fp1 == NULL){
        printf("\n Il file %s non e' stato trovato\n", NOME_FILE);
    }

    while (!feof(Fp1)){
         fscanf(Fp1, "%d %d\n", &n, &k);
         //printf("%d %d\n", n, k);
    }      

    fflush(Fp1);
    fclose(Fp1);
    fflush(stdin);
    
    getchar();
}
Spero di essere stato chiaro, grazie a chi risponde.

PM Quote
Avatar
gantonio (Normal User)
Guru^2


Messaggi: 1532
Iscritto: 09/09/2007

Segnala al moderatore
Postato alle 21:42
Lunedì, 12/05/2008
Manca la relazione tra quello che non sapresti fare e quello che hai fatto ...

Ovvero, cosa non va nel tuo programma? Problemi? Errori? Malfunzionamenti logici?

E come e' fatto esattamente il tuo file dati? Le coppie sono separate? Da cosa? Mostra un esempio ...

PM Quote
Avatar
radeon (Normal User)
Newbie


Messaggi: 6
Iscritto: 12/05/2008

Segnala al moderatore
Postato alle 22:24
Lunedì, 12/05/2008
La cosa che non riesco a fare è prendere n e k dal file (n e k nel file sono separati da uno spazio es: 4 2) e creare l'array che mi interessa. Il codice che ho presentato sopra fa vedere fin dove arrivo. Se compilo quello che ho fatto, a video mi fa vedere i valori presenti nel file, ma poi vado nei casini quando si tratta di creare la struttura dati che mi interessa con n e k presenti nel file.

PM Quote
Avatar
gantonio (Normal User)
Guru^2


Messaggi: 1532
Iscritto: 09/09/2007

Segnala al moderatore
Postato alle 9:44
Martedì, 13/05/2008
Se hai letto correttamente i valori nella variabile n, devi allocare la memoria per l'array dinamico.

Lo puoi fare con

int *arr;

arr = (int *)malloc(n*sizeof(int));

e quando non ti serve piu', liberare la memoria con

free(arr);

PM Quote
Avatar
radeon (Normal User)
Newbie


Messaggi: 6
Iscritto: 12/05/2008

Segnala al moderatore
Postato alle 14:35
Mercoledì, 14/05/2008
int main(int argc, char **argv)
{    
    // variabili
    int n, k, x;
    int *nData, *kData;

    FILE *Fp1;
    
    //File aperto in sola lettura
    Fp1 = fopen(NOME_FILE, "r");
    
    //Controllo sul file
    if (Fp1 == NULL){
        printf("\n Il file %s non e' stato trovato\n", NOME_FILE);
    }

    //Leggi il contenuto finchè non fisce il file
    while (!feof(Fp1)){
         fscanf(Fp1, "%d %d\n", &n, &k);
         printf("%d %d\n", n, k);                  // Stampa i valori che legge
         nData = (int*) calloc (n, sizeof(int));   // Dedico spezio in memoria per n e k
         kData = (int*) calloc (k, sizeof(int));
    }      

    // Qui devo prendere "k" e generare n numeri in base a "n" che siano compresi tra -k e k..
    /*for (x=0; x<n; x++){
        ...
        ...
    }*/
    
    //Chiusura del file
    fflush(Fp1);
    fclose(Fp1);
    fflush(stdin);
        
    //Libero memoria    
    free(nData);
    free(kData);
    
    getchar();
}

Ho seguito i consigli precedenti, ma arrivo ad un punto cieco quando devo prendere "k" dal file e generare n numeri in base a "n" che siano compresi tra -k e k..Non saprei nemmeno come iniziare..Generare il range (-k...k) lo so creare, ma non so dirgli di creare "n" elementi

PM Quote
Avatar
Bond93 (Ex-Member)
Pro


Messaggi: 135
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 18:39
Mercoledì, 14/05/2008
allora per creare un vettore di n elementi fai così ( è il vettore dinamico accennato da gantonio ):
Codice sorgente - presumibilmente C/C++

  1. int *vtc;
  2. ...[acquisizione di n e k dal file]
  3. vtc= malloc(sizeof(int)*n);
  4. for( i=0;i<n;i++)
  5. vtc[i]=rand()%(2*k)-k


malloc è una funzione che ritorna un puntatore alla memoria che ha allocato.
Le dimensioni della memoria sono l'arg. della funzione
Spero di essere stato chiaro...
Bond

PM Quote
Avatar
radeon (Normal User)
Newbie


Messaggi: 6
Iscritto: 12/05/2008

Segnala al moderatore
Postato alle 21:45
Mercoledì, 14/05/2008
Grazie Bond sei stato molto chiaro! Ho provato a fare quello che hai detto ma il programma mi restituisce i valori che vanno da -k a k-1, cioè se k=2, i volori che mi restituisce sono: -2 -1 0 1 e non c'è il 2. (LASCIANDO STARE "n" che va bene).

//Leggi il contenuto finchè non fisce il file
    while (!feof(Fp1)){
          
         fscanf(Fp1, "%d %d\n", &n, &k);
         printf("Valori presenti nel file: %d %d\n\n", n, k); // Stampa i valori che legge
        
         //Metto n in memoria
         nData = malloc(sizeof(int)*n);

         printf("Valori calcolati: ");

         srand(time(NULL)); //Inizializzo generatore        
        
         for(j=0; j<n; j++){
                  nData[j] = rand()%(2*k)-k;
                  printf(" %d ", nData[j]);  
         }
    }  
Come si può risolvere l'inconveniente? Magari creando un array con dentro k?

PM Quote
Avatar
Bond93 (Ex-Member)
Pro


Messaggi: 135
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 11:32
Giovedì, 15/05/2008
Codice sorgente - presumibilmente C/C++

  1. int *vtc;
  2. ...[acquisizione di n e k dal file]
  3. vtc= malloc(sizeof(int)*n);
  4. for( i=0;i<n;i++)
  5. vtc[i]=rand()%(2*k)-k
  6. if(!rand()%2) vtc[i]+=1;


PM Quote
Avatar
radeon (Normal User)
Newbie


Messaggi: 6
Iscritto: 12/05/2008

Segnala al moderatore
Postato alle 13:50
Giovedì, 15/05/2008
Avevo già provato anche io questa soluzione ma non va bene purtroppo..se faccio così non genera più il valore -2 per esempio..

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo