Matrice dinamica di stringhe

di il
7 risposte

Matrice dinamica di stringhe

Buongiorno a tutti,
il mio problema è dover creare una matrice che acquisisca (e stampi) un file (.txt) così formato:
[IDmatricola] [cognome] [mediavoto]
[IDmatricola] [cognome] [mediavoto]
....

non sapendo quante matricole ci siano devo prima contare le righe che compongono il file...
di seguito vi posto come ho ho pensato di fare, però non mi funziona...

#include <stdio.h>
#include <stdlib.h>

int main (void)
{
     char matricola[6];
     char cognome[20]
     char media[2];

     int c, i, righe;

     char ***database

     FILE *file_matricole;

     /*acquisizione del numero di righe della matrice*/
     righe=0;
     file_matricole = fopen("matricole.txt", "r");

     while ((c = getc (file_matricole)) != EOF)
          if ( c== '\n')
               righe++;

     printf("%d\n", righe);

     fclose(file_matricole);

     /*dimensionamento della matrice*/
     database = (char**) malloc(sizeof(char*) *righe);

      for(i=0; i<righe; i++)
          database[i] = (char*) malloc (sizeof (char)*3);
     /*acquisizione dei valori da file*/
     file_matricole = fopen("matricole.txt", "r");

     for (i = 0; i< righe; i++)
     {
          fscanf(file_matricole, "%s", matricola);
          database[i][0] = matricola;
          fscanf(file_matricole, "%s", cognome);
          database[i][1] = cognome;
          fscanf(file_matricole, "%s", media);
          database[i][2] = media;
     }
     /*stampa matrice*/

     for(i=0; i<righe; i++)
          printf("matricola: %s cognome: %s media: %s\n", database[i][0], database[i][1], database[i][2]);

return(0);
}
il problema è che mi stampa sempre n volte il numero matricola e media ultimo e il cognome non lo stampa per niente...

grazie anticipatamente per qualsiasi tipo di aiuto!

7 Risposte

  • Re: Matrice dinamica di stringhe

    
    for(i=0; i<righe; i++)
              database[i] = (char*) malloc (sizeof (char)*3);
    
    come fa un puntatore a stare nello spazio di un char? Per quel che so un puntatore vuole 4 byte (può essere anche di più dipende dall'implementazione) mentre il char 1 byte soltanto. Il tuo debugger che ti dice?

    Tu stai assegnando alla posizione i-esima l'indirizzo della stringa matricola ecc ma anche se il contenuto cambia, la posizione della stringa in memoria resta la stessa. Per forza che avrai sempre li stessi dati ripetuti.
  • Re: Matrice dinamica di stringhe

    Mhm dici che mi conviene cambiare struttura dati?
  • Re: Matrice dinamica di stringhe

    Devi imparare ad usare le strutture.
  • Re: Matrice dinamica di stringhe

    Secondo me potresti utilizzare una coda, realizzata con una struttura dati ed effettuando l' allocazione dinamica della memoria, pertanto:
    char matricola[6];
    char cognome[20];
    char media[2];
    char ***database;
    li sostituerei con la struttura dati:
    struct record{
      int matricola[6];
      char cognome[20];
      float media[2];
      struct record *pun;
      }; 
    mentre l' allocazione dinamica la effettuerei in questo modo:
    p=(struct record *)malloc(sizeof(struct record));
    fscanf(file_matricole,"%s\n",p->matricola);
    fscanf(file_matricole,"%s\n",p->cognome);
    fscanf(file_matricole,"%s\n",p->media); 
    paus=p;
         
    for (i = 1; i< righe/3; i++)
      {
        paus->pun=(struct record *)malloc(sizeof(struct record));
        paus=paus->pun;
        fscanf(file_matricole,"%s\n", paus->matricola);
        fscanf(file_matricole,"%s\n", paus->cognome);
        fscanf(file_matricole,"%s\n", paus->media);     
         }  
    paus->pun=null;
    
    Anche se in questo modo il file matricole.txt deve essere fatto così:
    [IDmatricola] 
    [cognome] 
    [mediavoto]
    [IDmatricola] 
    [cognome] 
    [mediavoto]
    ......
    In definitiva il programma utilizzando questa struttura dati sarebbe:
    #include <stdio.h>
    #include <stdlib.h>
    #define null 0
    
    struct record{
      int matricola[6];
      char cognome[20];
      float media[2];
      struct record *pun;
      };
    
    
    int main (void)
    {
       int c, i, righe;
       struct record *p, *paus;
       FILE *file_matricole;
    
       /*acquisizione del numero di righe del file*/
       righe=0;
       file_matricole = fopen("matricole.txt", "r");
    
       while ((c = getc (file_matricole)) != EOF)
        if ( c== '\n')
        righe++;
    
       printf("%d\n", righe);
       fclose(file_matricole);
    
       /*acquisizione dei valori da file*/
       file_matricole = fopen("matricole.txt", "r");
        
       p=(struct record *)malloc(sizeof(struct record));
       fscanf(file_matricole,"%s\n",p->matricola);
       fscanf(file_matricole,"%s\n",p->cognome);
       fscanf(file_matricole,"%s\n",p->media); 
       paus=p;
       
        for (i = 1; i< righe/3; i++)
         {
           paus->pun=(struct record *)malloc(sizeof(struct record));
           paus=paus->pun;
           fscanf(file_matricole,"%s\n", paus->matricola);
           fscanf(file_matricole,"%s\n", paus->cognome);
           fscanf(file_matricole,"%s\n", paus->media);     
          }  
          paus->pun=null;    
          fclose(file_matricole);      
        
        /*stampa informazioni matricola*/
         while(p!=null) 
          {  
           printf("matricola: %s cognome: %s media: %s\n", p->matricola, p->cognome, p->media);
           p=p->pun;
           } 
       return(0);
      }
    Se può andarti bene lo stesso.
    Matteo
  • Re: Matrice dinamica di stringhe

    Grazie mille, non avevo pensato alle struct perchè non sono molto pratico nell'utilizzarle... mi siete stati di grande aiuto!
  • Re: Matrice dinamica di stringhe

    Figo !!!!! sarebbe possibile leggere il file di testo e inserirlo nella coda in modo ordinato secondo il campo matricola ??

    aspetto risposta!!! THX
  • Re: Matrice dinamica di stringhe

    sta_ceppa ha scritto:


    Figo !!!!! sarebbe possibile leggere il file di testo e inserirlo nella coda in modo ordinato secondo il campo matricola ??
    Si Creando una lista ordinata (single/double linked).
    Come? Cosi:
    http://it.wikipedia.org/wiki/Lista_concatenat
Devi accedere o registrarti per scrivere nel forum
7 risposte