Leggere un file di testo e salvarlo in un vettore di stringh

di il
3 risposte

Leggere un file di testo e salvarlo in un vettore di stringh

Salve a tutti, sono nuovo, quindi mi presento!
Mi chiamo Luca, ho 23 anni e studio al Politecnico di Torino.. ed è proprio per questo che scrivo!

Devo fare un lavoro immenso di server/client in c... ma, stupidamente, sono bloccato su una cosa elementare! Non riesco a leggere e memorizzare correttamente un normale file di testo.
Dato che la cosa mi sembravo alquanto strana, ho provato a estrarre il mio codice e fare un programmino che faccia solo la lettura e la memorizzazione, ma anche qui ho problemi!!!


Questo è il mio codice:
#include <stdio.h>
#include "errlib.h"
int main (int argc, char *argv[])
{
  FILE *f1;
  char a;
  int c,i,j;
  char elenco_utenti[20][8];

  i=0;
  j=0;

  if (argc != 2)
    err_quit ("usage: %s file1", argv[0]);

  if ((f1=fopen(argv[1],"rb")) == NULL)
    err_sys ("(%s) error - can't open file '%s'", argv[0], argv[1]);


  while ((c=fgetc(f1)) != EOF){

				a= (char)c;
		  		printf("%c", a);

		  	  if((c!='\n')){
		  		elenco_utenti[i][j] = c;
		  		j++;
			  }else{
				//c=fgetc(f1);
				elenco_utenti[i][j+1] = '\0';
				i++;
				j=0;}
}
 
  if (fclose(f1))
   err_msg ("(%s) warning - can't close file '%s'", argv[0], argv[1]);
   
   
   printf("\nOra stampo dalla memoria\n");
   
   for(i=0;i<20; i++)
      for(j=0;j<8; j++)
	     printf("%c", elenco_utenti[i][j]);
   
   
  return 0;
}
E questo il file da leggere:
piero
flavio
marco
vale
maria
fra
danilo
gianfry
giulia
angela
Mi conviene cambiare modo di memorizzazione dati? Cosa posso fare?

3 Risposte

  • Re: Leggere un file di testo e salvarlo in un vettore di stringh

    Ci sono un paio di errori:
    1) Nel giro di lettura char by char, quando rileva lo 0xd, assegni all'array il terminatore di stringa una posizione + a destra. elenco_utenti[j+1] = '\0'; devi togliere il +1, infatti j è già incrementato nella if precedente.
    2) Nella visualizzazione dell'array non tieni conto del numero di nomi realmente inseriti...
    ...e poi sarebbe sufficiente puntare al primo elemento.
    
       ...
       for(n=0;n<i; n++)
            printf("%s", elenco_utenti[n]);
       ...
    
    Altre considerazioni:
    dovresti controllare di non superare il dimensionamento dell'array nella lettura del file (sia per i che per j).
    Immagino sia una lista di nomi ristretta, per cui vale la pena incrementare l'attuale dimesione di elenco_clienti

    Saluti,
    Max
  • Re: Leggere un file di testo e salvarlo in un vettore di stringh

    Avevo corretto così:
    #include <stdio.h>
    #include <string.h>
    #include "errlib.h"
    #define MAXBUFL 255
    int main (int argc, char *argv[])
    {
      FILE *f1;
      char a;
      int c,i,j, fine;
      char elenco_utenti[20][8];
    // char buf[MAXBUFL];
      memset(elenco_utenti, 0, sizeof(elenco_utenti));
      
      i=0;
      j=0;
    
      if (argc != 2)
        err_quit ("usage: %s file1", argv[0]);
    
      if ((f1=fopen(argv[1],"r")) == NULL)
        err_sys ("(%s) error - can't open file '%s'", argv[0], argv[1]);
    
    
      while ((c=fgetc(f1)) != EOF){
    
    				a= (char)c;
    		  		printf("%c", a);
    
    		  	  if((c!='\n')){
    		  		elenco_utenti[i][j] = c;
    		  		j++;
    			  }else{
    				elenco_utenti[i][j] = '\0';
    				i++;
    				fine=i;
    				j=0;}
    }
     
      if (fclose(f1))
       err_msg ("(%s) warning - can't close file '%s'", argv[0], argv[1]);
       
       
       printf("\nOra stampo dalla memoria:\n");
       
       for(i=0;i<fine+1; i++){
          for(j=0;j<8;j++){
    	     printf("%c", elenco_utenti[i][j]);
    		// printf("%s", elenco_utenti[i]);
    		 }
       printf("\n");}
       
       
      return 0;
    }

    e sembra andare!

    ho provato poi a fare la modifica da te suggerita (nel codice ora postato è commentata), ma così non stampa bene come nel caso carattere per carattere; come mai?
  • Re: Leggere un file di testo e salvarlo in un vettore di stringh

    ho provato poi a fare la modifica da te suggerita (nel codice ora postato è commentata), ma così non stampa bene come nel caso carattere per carattere; come mai?
    Non è proprio quello che avevo scritto precedentemente...
    perchè setti fine dentro il ciclo while, quando è sufficiente assegnarlo una sola volta in uscita dove fine=i? perchè fine+1?
    
    ...
    for(i=0;i<fine; i++)
       printf("%s\n", elenco_utenti[i]);
    ...
    
    Saluti,
    Max
Devi accedere o registrarti per scrivere nel forum
3 risposte