Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    Lettura e archiviazione dati di file in C

    Salve,

    stavo provando a scrivere un file in C per leggere un file di testo con nomi e cognomi.
    Tali nomi e cognomi (uno per riga) li vorrei poi archiviare in un vettore tale che ad ogni posizione corrisponda un nome e cognome. Poi, ma questo non è il problema, dovrei estrarre a caso dei numeri e quindi le persone che corrispondono a quel numero.

    Il problema credo che sia legato ai puntatori (sono nuovo del mestiere e quindi abbiate compassione).
    In pratica ho scritto il codice che allego. In pratica credo di aver creato un vettore di puntatori che puntano tutti all'ultimo valore letto, mentre il puntatore nome[0] vorrei che puntasse al valore letto nella prima riga,
    nome[1] a quello della seconda e così via.

    Di seguito il codice... grazie in anticipo per l'eventuale attenzione.

    #include <stdio.h>
    #include <string.h>

    int main() {
    char c[80];
    FILE *file;
    char *nomi[30];

    int i, j;

    file = fopen("input.dati", "r");
    j=0;
    if(file==NULL) {
    printf("Error: can't open file.\n");
    return 1;
    }
    else {
    printf("File opened successfully. Contents:\n\n");

    while(fgets(c, 80, file)!=NULL) {
    printf("String: %s", c);
    nomi[j]=c;
    j=j+1;
    }

    printf("\n\nNow closing file...\n");
    fclose(file);


    }


    printf("%s", nomi[0]);
    printf("%s", nomi[1]);
    printf("%s", nomi[2]);
    return 0;
    }

  2. #2
    Utente di HTML.it L'avatar di Stoicenko
    Registrato dal
    Feb 2004
    Messaggi
    2,254
    il vettore di puntatori chiamato nomi deve essere inizializzato prima di assegnarli i puntatori stessi..

    attenzione al regolamento della sezione, il codice va postato nei tag CODE

  3. #3
    Salve, ho inizializzato (non so se è fatto nel modo giusto), ma il problema è sempre lo stesso...
    Di seguito il codice modificato:

    codice:
    #include <stdio.h>
    #include <string.h>
    
    int main() {
      char c[80]; 
      FILE *file; 
      char *nomi[30];
    
      int i, j;
    
      // Inizio inizializzazione
      for(i=0;i<30;i++){
        nomi[i]='\0';
      }
      // Fine inizializzazione
    
    
      file = fopen("input.dati", "r"); 
      j=0;
      if(file==NULL) {
        printf("Error: can't open file.\n");
        return 1;
      }
      else {
        printf("File opened successfully. Contents:\n\n");
    
        while(fgets(c, 80, file)!=NULL) { 
          printf("String: %s", c);
          nomi[j]=c;
          j=j+1;
        }
    
        printf("\n\nNow closing file...\n");
        fclose(file);
    
    
      }
    
    
      printf("%s", nomi[0]);
      printf("%s", nomi[1]);
      printf("%s", nomi[2]);
      return 0;
    }

  4. #4
    Utente di HTML.it L'avatar di Stoicenko
    Registrato dal
    Feb 2004
    Messaggi
    2,254
    no devi allocare la memoria!! quel char* nomi[30] è solo la dichiarazione di un puntatore a 30 puntatori, non hai allocato la memoria.. usa la malloc o la new per allocare e la free o la delete[] per deallocarla

    Ps: queste sono conoscenze basilari del linguaggio.. forse serve una ripassatina al tuo libro di testo..

  5. #5
    Salve,
    ho risolto in altro modo...
    Ho definito una struttura ed invece di usare fgets sto usando fscanf.
    Ecco il codice funzionante
    codice:
    #include <stdio.h>
    #include <string.h>
    
    typedef struct
    {
      char nome[50];
      char cognome[50];
    } anagrafe;
    
    
    int main() {
      FILE *FilePtr; 
      anagrafe persone[30];
      int i, j;
    
     
      FilePtr = fopen("input.dati", "r"); 
      j=0;
      if(FilePtr==NULL) {
        printf("Error: can't open file.\n");
        return 1;
      }
      else {
        printf("File opened successfully.\n");
        while(!feof(FilePtr)) {
          fscanf(FilePtr,"%s %s", &persone[j].nome, &persone[j].cognome);
          j=j+1;
        }
    
        fclose(FilePtr);
    
    
      }
    
    
      for(i=0;i<j-1;i++){
        printf("%s %s\n", persone[i].nome, persone[i].cognome);
      }
    
      return 0;
    }
    Grazie per l'aiuto

  6. #6
    Utente di HTML.it L'avatar di Stoicenko
    Registrato dal
    Feb 2004
    Messaggi
    2,254
    in realtà non hai risolto nulla, hai solo aggirato il problema..

    invece di usare puntatori hai usato delle strutture (oggetti) che quindi con il costruttore già si allocano da sole la memoria..

    sta di fatto che, dal primo post si intuisce, non sai usare i puntatori.

  7. #7
    Ah, sì!
    In effetti il problema coi puntatori ce l'ho (sto prendendo in mano adesso il C) e cercherò di risolverlo presto.
    Il mio problema comunque non era quello di usare i puntatori, ma di prendere l'input dal file e di fare un programma che eseguisse determinate operazioni, in quel senso ho "risolto".
    Comunque grazie per i suggerimenti.
    Alla prossima!!!

  8. #8
    Utente di HTML.it L'avatar di Stoicenko
    Registrato dal
    Feb 2004
    Messaggi
    2,254
    certo, attenzione che i puntatori sono la base dei linguaggi "c style" come appunto il c

  9. #9
    Salve, ho letto il codice iniziale e ho notato un errore.

    Il tuo problema è il fatto che tutti i nomi puntano alla
    stessa stringa.

    Mi spiego:

    Hai un array di 30 puntatori che tu assegni con
    codice:
    nomi[j]=c;
    Quindi alla fine, tutti i tuoi puntatori nomi[] punteranno
    allo stesso array di caratteri (cioè alla stessa locazione
    di memoria), che tu ogni volta cambi leggendo dal file.

    Percui alla fine tutti i nomi punteranno all'ultima stringa
    letta.

    Dovresti usare 30 diversi puntatori a caratteri oppure,
    come diceva Stoicenko, dovresti utilizzare la malloc per
    avere una nuova locazione di memoria (per ogni stringa)
    in cui copiare la stringa e poi assegnarla all'array nomi.

    Spero di essermi spiegato bene.

  10. #10
    Ciao,
    grazie per la risposta.
    La risposta è chiara... il fatto è che allo stato attuale delle mie conoscenze ancora non riesco a coglierla bene.
    Avevo intuito che il problema era in quella riga lì, ma ancora non riesco a capire bene il processo.
    Per ora ho accantonato questo problema e mi sto mettendo a leggere qualcosina di più fondamentale sui puntatori.
    Appena ho finito questo passo provo a dare ancora uno sguardo a questo codice e lo modifico con tutti i crismi del buon programmatore in C
    Ciao!!

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.