Linguaggio C, lettura di una riga da file

di il
18 risposte

Linguaggio C, lettura di una riga da file

Ho un file, il quale contiene:
"1 2 3 4 5" (ogni numero è separato da uno spazio).

Ipotizzando che io non conosca il contenuto del file, vorrei sapere quanti elementi sono presenti nella riga.

Allora, ho pensato a questo:
int main()
{
	FILE *f = fopen("/home/davide/Scrivania/Esercizio 4/file.txt", "r");
	char flag;
	int i = 0;
	
	while(flag != '\0')
	{
		fscanf(f, "%c", &flag);
		i++;
		printf("flag: %c", flag);
	}
	printf("\nElementi nel file: %d\n", i);
}
Il problema è che flag è tipo char, dunque 1 byte e non può contenere un intero (quello all'interno del file) che ne occupa 8.

Quindi, avevo pensato di dichiarare flag come int, però a questo punto non andrebbe bene la condizione del while. Insomma come devo fare? Però senza tener conto degli spazi. Vorrei che i mi desse 4.

Un'altra cosa. Se avessi un file del tipo:

1 2 3 4
4 5 6 7
3 4 5 6

E volessi contare il numero di ritorni a capo e dunque il numero di righe, come bisognerebbe fare?

Grazie

18 Risposte

  • Re: Linguaggio C, lettura di una riga da file

    Invece di utilizzare fscanf() prova ad utilizzare fgets() (se cerchi in questo forum trovi un sacco di esempi) che ti permette di leggere riga per riga; la lettura avviene in un buffer in memoria e pertanto in quel buffer poi ci puoi fare quello che vuoi
  • Re: Linguaggio C, lettura di una riga da file

    Tipo una cosa del genere?
    
    int main()
    {
    	int str[100];
    	FILE *f = fopen("/home/davide/Scrivania/Esercizio 4/file.txt", "r");
    	int i = 0;
    
    	if(f == NULL) printf("Errore nell'apertura del file.");
    	else
    	{
    		fgets(str, '\0', f);
    	
    		while(str[i] != '\0')
                    {
               	        printf("str[%d] = %d\n", i, str[i]);
                            i++;
                    }
    	}
    }
    Non funziona.. dove sbaglio?
  • Re: Linguaggio C, lettura di una riga da file

    Non so cosa tu stia cercando di fare con questo codice; quello che posso suggerirti è quello di fare un passo alla volta.
    a) Prima di tutto devi leggere il file una riga alla volta e per questo ti suggerisco di leggere

    b) Solo dopo che il tuo programma è in grado di leggere una riga alla volta (e per adesso di stampare la riga a video) puoi passare allo step successivo che è quello di stampare, alla fine, il numero di righe che hai trovato
    c) alla fine predisponi una funzione che riceve in input una stringa che a questo punto richiamerai per ogni riga letta (e per adesso fai in modo che si limiti a stampare la stringa)
    d) implementi questa funzione che si analizza tutta la stringa e conta quante cifre ci sono
  • Re: Linguaggio C, lettura di una riga da file

    Ti ringrazio per la dispensa, l'ho letta.

    Praticamente vorrei questo: ho un file con all'interno una riga di numeri.
    Per esempio: 1 2 3 4 5 6
    E vorrei che l'output mi dicesse: "Nella riga ci sono 6 elementi".

    Allora ho pensato a questo algoritmo:
    
    #include<stdlib.h>
    #include<stdio.h>
    
    int main() 
    {
    	FILE *fd;
    	char buf[200];
    	char *res;
    	int i = 0, n = 0;
    
    	fd=fopen("/home/davide/Scrivania/righe.txt", "r");
    	if( fd==NULL ) 
    	{
    		perror("Errore in apertura del file");
    		exit(1);
    	}	
    
    	res=fgets(buf, 200, fd);
    	printf("%s", buf);
    	while(res[i] != '\0')
    	{
    		i++;
    		n++;
    	}
    	n/=2; //Toglie il numero di spazi che sono 
    		//praticamente la metà degli elementi sulla riga
    	printf("La stringa contiene %d elementi\n", n);
    }
    Fino a che inserisco nel file: 1 2 3 4 5 6 7 8 9 10, mi dice che ci sono 10 elementi il che va bene.
    Ma quando inserisco 1 2 3 4 5 6 7 8 9 10 11, mi dice che ce ne sono 12. Perché?

    Tutto questo mi serve perché devo acquisire le dimensioni di una matrice che si trova all'interno del file. Ecco perché mi servono il numero degli elementi della prima riga e il numero delle righe. Sto cercando di fare un passo alla volta come mi hai detto tu
  • Re: Linguaggio C, lettura di una riga da file

    Perché prima della divisione n rappresenta il numero di byte contenuti nel file. Se tu avessi un solo intero da 6 cifre, n sarebbe uguale a ???

    Quindi devi trovare un altro algoritmo...

    ...C'è qualcosa che non varia qualunque numero ci sia?
  • Re: Linguaggio C, lettura di una riga da file

    Ah.. Capito.. con 123456 sulla prima riga mi da 3.. Perché?! Ho capito che si tratta di byte ma se sono 6 cifre di interi, 6 x 4 byte = 24 (?). Mi è andato in pappa il cervello
  • Re: Linguaggio C, lettura di una riga da file

    Perché la fgets legge i numeri come caratteri

    12345 = 5 cifre = 5 char
  • Re: Linguaggio C, lettura di una riga da file

    Ah, ok. Grazie

    Ma quindi non potete darmi un consiglio su come risolvere? Mi sono bloccato, non posso continuare il programma così..
  • Re: Linguaggio C, lettura di una riga da file

    C'è una relazione tra spazi e numeri?
  • Re: Linguaggio C, lettura di una riga da file

    Ragazzi esiste una funzione che legge un carattere per volta?
    Esiste la possibilità di creare un buffer temporaneo?
    Se quindi io creo un buffer e lo setto a 0 , poi inizio a leggere carattere per carattere inserendolo nel buffer prima di incontrare lo spazio non ho risolto il problema?
    Bho forse mi sbaglio,forse si sono dimenticati di inserire tale funzione nello standard.o forse il buffer è solo l'overflow che ricevo ogni volta che compilo per la prima volta un programma....
  • Re: Linguaggio C, lettura di una riga da file

    ale99 ha scritto:


    C'è una relazione tra spazi e numeri?
    Non so, magari che i numeri sono interi e gli spazi no..?
  • Re: Linguaggio C, lettura di una riga da file

    Tra due numeri qualsiasi c'è sempre uno e un solo uno spazio

    Quindi :

    Numeri=spazi+1 se e solo se Numeri > 0

    Ma per sapere se Numeri=0 basta controllare se il file è vuoto

    Quindi contando gli spazi ( dopo aver verificato che il file nn sia vuoto ) puoi conoscere Numeri
  • Re: Linguaggio C, lettura di una riga da file

    Allego solo una parte del codice.
    
    int main()
    {
          ....
          int i = 0, n = 0;
    		while(res[i] != '\0')
    		{
    			if(res[i] == ' ')
    				n++;
    			i++;
    		}
    		n += 1;
    }
    
    Output:
    1 2 3 4 5 6 8 9 10 11
    La stringa contiene 10 elementi


    Mi da sempre lo stesso problema. Ho sbagliato io?
  • Re: Linguaggio C, lettura di una riga da file

    Qual'è il problema?
Devi accedere o registrarti per scrivere nel forum
18 risposte