Linguaggio C, contare elementi di un file

di il
8 risposte

Linguaggio C, contare elementi di un file

Devo contare quanti elementi, precisamente numeri, ci sono all'interno del file.

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

void array()
{
	int lunghezza = 0, i = 0;
	char buf[200];
	char *str;
	FILE *f = fopen("/home/davide/Scrivania/Esercizio 8/array.txt", "r");
	
	if(f == NULL) printf("Errore nell'apertura del file.\n");
	else
	{
		while(!feof(f))
		{
			str = fgets(buf, 200, f);
			while(str[i] != '\0')
			{
				if(str[i] == ' ')
					lunghezza++;
				i++;
			}
			lunghezza = lunghezza + 1;//In una stringa di numeri, separati ognuno
			     //da uno spazio, gli elementi della stinga sono
			     //n spazi + 1
		}
		printf("Lunghezza: %d\n", lunghezza);
	}
}
Però, c'è qualcosa che non va.

Ad esempio, nel mio caso, il file è:

1 2
3 4
5 6
7 8
9 0
1 2
3 4
6 7
1 2
6 5


Se andassi a stampare dovrebbe tornarmi 20, perché appunto sono venti numeri. Ma, a me, stampa 11. Perché?

Grazie

8 Risposte

  • Re: Linguaggio C, contare elementi di un file

    Prima della while ci manca una

    i=0;

    ma fossi in te scriverei soltanto
    
       else
       {
          while(fscanf(f, "%d", &v)==1)
    		  lunghezza++;
    
    	  printf("Lunghezza: %d\n", lunghezza);
       }
    
  • Re: Linguaggio C, contare elementi di un file

    oregon ha scritto:


    Prima della while ci manca una i=0
    Ce l'ho messa all'inizio!

    Mi spiegheresti nel dettaglio la tua alternativa?
    Se non vado errato lo scanf si blocca quando incontra uno spazio (?)

    Funziona come dici tu, però mi da questo warning:
    array.c: In function ‘array’:
    array.c:26:3: warning: format ‘%d’ expects argument of type ‘int *’, but argument 3 has type ‘char **’ [-Wformat=]
    while(fscanf(f, "%d", &str)==1)
    ^
  • Re: Linguaggio C, contare elementi di un file

    Per la tua soluzione : non intendevo la i=0; che hai messo all'inizio. Ti ho specificato "prima della while" intendendo proprio una riga prima della while !

    Per la soluzione che ti ho indicato, non ho usato str (e non devi usare un array di char) ma una variabile v intera dato che leggi numeri.
  • Re: Linguaggio C, contare elementi di un file

    oregon ha scritto:


    Per la tua soluzione : non intendevo la i=0; che hai messo all'inizio. Ti ho specificato "prima della while" intendendo proprio una riga prima della while !
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    void array()
    {
    	int lunghezza = 0, i;
    	char buf[200];
    	char *str;
    	FILE *f = fopen("/home/davide/Scrivania/Esercizio 8/array.txt", "r");
    	
    	if(f == NULL) printf("Errore nell'apertura del file.\n");
    	else
    	{
    		i = 0;
    		while(!feof(f))
    		{
    			str = fgets(buf, 200, f);
    			while(str[i] != '\0')
    			{
    				if(str[i] == ' ')
    					lunghezza++;
    				i++;
    			}
    			lunghezza = lunghezza + 1;
    		}
    		printf("Lunghezza: %d\n", lunghezza);
    	}
    }
    Sempre 11 mi stampa.
    Per la soluzione che ti ho indicato, non ho usato str (e non devi usare un array di char) ma una variabile v intera dato che leggi numeri.
    Ok, funge. Grazie
  • Re: Linguaggio C, contare elementi di un file

    Prima di questa while !

    str = fgets(buf, 200, f);
    i=0;
    while(str != '\0')
  • Re: Linguaggio C, contare elementi di un file

    Ahhh scusa!
    E come mai funziona solo così? Se la dichiaro prima di while(!feof(f)) perché non funziona!?
  • Re: Linguaggio C, contare elementi di un file

    Non riesci a spiegartelo? Pensaci un po'...
  • Re: Linguaggio C, contare elementi di un file

    oregon ha scritto:


    Non riesci a spiegartelo? Pensaci un po'...
    Ah sì, giusto. Se non la mettessi prima di while(str != '\0') la stringa successiva non verrebbe scandita dall'inizio, bensì da dove era arrivata i con la stringa precedente.

    PS: Grazie
Devi accedere o registrarti per scrivere nel forum
8 risposte