C, lunghezza stringa da file

di Anonimizzato14377 il
14 risposte
Il file contiene:
ciao
E il codice è:
int main()
{
	FILE *f = fopen("pal.txt", "r");
	if(f == NULL)
	{
		printf("Errore nell'apertura del file!\n");
		exit(1);
	}
	char buffer[100];
	int i = 0;
	while(!feof(f))
	{
		i = 0;
		fgets(buffer, 100, f);
		while(buffer[i] != '\0')
			i++;
		printf("i: %d\n", i);
	}
			
}
Che stampa i: 4 che è giusto.

Ora il mio file è:
ciao
mondo
il programma stampa:

i: 5
i: 5


che è sbagliato.

Centra qualcosa in carattere di fine riga?

14 Risposte

  • L'errore è nel tuo algoritmo, perchè resetti i ad ogni riga!
  • Perché scusa? Non è giusto resettarlo? Per ogni riga (stringa) che prelevo dal file devo riportare i a zero altrimenti come faccio a conoscere la dimensione di ogni stringa?

    Comunque, ho tolto il reset di i e non cambia.
  • E' corretto azzerare i

    La fgets aggiunge un '\n' alla stringa letta. Quindi, se questo carattere è alla fine della stringa, devi considerare un carattere in meno e tutto torna.
  • In questo modo intendi?
    int main()
    {
    	FILE *f = fopen("pal.txt", "r");
    	if(f == NULL)
    	{
    		printf("Errore nell'apertura del file!\n");
    		exit(1);
    	}
    	char buffer[100], *stringa;
    	int i = 0;
    	while(!feof(f))
    	{
    		fgets(buffer, 100, f);
    		i = 0;
    		while(buffer[i] != '\0')
    			i++;
    		i--;
    		printf("i: %d\n", i);
    	}
    }
    Così mi da lo stesso problemi.

    Se il file contiene solo "ciao" stampa i = 3, sbagliato.
    Se il file contiene:
    "ciao
    mondo"
    stampa:
    i: 4
    i: 4

    che è ancora sbagliato
  • Infatti ti avevo scritto

    "se questo carattere è alla fine della stringa"

    Quindi devi controllare se c'è ...
  • Ok, ora ci provo.

    "Quindi, se questo carattere è alla fine della stringa,.."

    con carattere ti riferisci a '\n' oppure al carattere i-esimo della stringa?

    Se fosse il primo caso:

    La fgets aggiunge un '\n' alla stringa letta, quindi non è automatico che ci sia quel carattere alla fine della stringa?

    Non ho capito questa cosa
  • Mi riferisco al '\n'

    Se la fgets incontra un carattere '\n' termina l'input ma aggiunge il '\n' alla stringa letta.

    P.S. Perché utilizzi un contatore al posto della strlen per ottenere la lunghezza della stringa ??
  • Perché non so se all'esame sarà possibile utilizzare strlen, poi anche per esercitarmi meglio sulle stringhe in generale.

    Comunque con strlen non mi funziona ugualmente. L'ho utilizzata male?
    
    int main()
    {
    	FILE *f = fopen("pal.txt", "r");
    	if(f == NULL)
    	{
    		printf("Errore nell'apertura del file!\n");
    		exit(1);
    	}
    	char buffer[100], *stringa;
    	int i = 0;
    	while(!feof(f))
    	{
    		fgets(buffer, 100, f);
                    i = 0;
    		i = strlen(buffer);
    		printf("i: %d\n", i);
    	}
    }
  • Certe volte non so se mi spiego male io ...

    Ti ho detto di controllare se l'ultimo carattere della stringa è un '\n' e in questo caso di considerarlo. All'ultimo carattere ci arrivi facilmente con la strlen o con la tua i, MA IL CONTROLLO LO DEVI FARE.
  • Vedi un pò se questa funzioncina ti può aiutare
    int mystrlen( char *str )
    {
       int cnt = 0;
       while(*str)
       {
           if( *str == '\n' )
              break; 
           cnt++;
           str++;
       }
       return cnt; 
    }
  • Sarò io che non capisco.. Così?
    
    	while(!feof(f))
    	{
    		fgets(buffer, 100, f);
    		i = 0;
    		i = strlen(buffer);
    		if(buffer[i-1] == '\n')
    			i++;
    		printf("i: %d\n", i);
    		
    	}
  • Semmai
          if(buffer[i-1] == '\n')
             i--;
    però io ci metterei anche un controllo che i sia maggiore di 0
    Potresti farne una funzione...
  • 1) che senso hanno due righe del tipo

    i = 0;
    i = ...

    Se il valore di i viene assegnato subito dopo che senso ha una linea prima azzerarlo?
    Non è importante ma bisogna ragionare su quello che si scrive ...

    2) okay, ora fai il controllo ... ma che fai .... se trovi il carattere '\n' aumenti i ??? Allora non hai proprio capito o non ragioni su quello che scrivi ... eppure è molto molto semplice ...

    Tu devi aumentare i come hai fatto fino ad ora ... alla fine del ciclo, se i è maggiore di zero, controlli l'elemento [i-1] della stringa e se è '\n' DIMINUISCI i di 1 ...

    Non ti scrivo pezzi di codice per farti ragionare ... devi arrivarci da solo a scrivere del codice così elementare ...
  • oregon ha scritto:


    1) che senso hanno due righe del tipo
    i = 0;
    i = ...
    i = 0, mi sono dimenticato di toglierlo quando ho cambiato il ciclo di scansione per la dimensione della stringa con strlen.

    oregon ha scritto:


    2) okay, ora fai il controllo ... ma che fai .... se trovi il carattere '\n' aumenti i ???[/u] Allora non hai proprio capito o non ragioni su quello che scrivi ... eppure è molto molto semplice ...


    Più la seconda

    oregon ha scritto:


    Non ti scrivo pezzi di codice per farti ragionare ... devi arrivarci da solo a scrivere del codice così elementare ...


    Preferisco così infatti, grazie!
Devi accedere o registrarti per scrivere nel forum
14 risposte