C, contare righe e colonne matrice

di il
2 risposte

C, contare righe e colonne matrice

Matrice.txt
a b c d e
f g h j u
e r t y u
Codice:
#include <stdio.h>
#include <stdlib.h>

int main()
{
	FILE *f = fopen("matrice.txt", "r");
	if(f == NULL)
	{
		printf("Errore");
		exit(1);
	}
	char **matrice, buffer[100];
	int righe = 0, colonne = 0, i = 0;
	
	while(!feof(f))
	{
		fgets(buffer, 100, f);
		righe++;
	}
	while(buffer[i] != '\0')
	{
		if(buffer[i] != ' ')
			colonne++;
		i++;
	}
	printf("righe: %d, colonne: %d", righe, colonne);
}
Questo qui è un programma che consente di conoscere il numero di righe e colonne in una matrice da file.

Mi chiedevo se ci fosse un'implementazione migliore, più efficiente.

Un difetto dell'algoritmo è che se all'ultima riga andassi a capo e salvassi mi stamparebbe il numero di righe e colonne incrementate entrambe di 1.

Come posso evitare questa cosa?

2 Risposte

  • Re: C, contare righe e colonne matrice

    Potresti scrivere una funzione che dato in input la riga letta ti dice se è una riga non valida (ritorna 0) o se è valida indicandoti quante colonne ci sono.
       
       colonne = 0;
       while(!feof(f))
       {
          fgets(buffer, 100, f);
          currcolonne = CountColonne( buffer );
          if( currcolonne > 0 )
          {
              righe++;
              if( currcolonne > colonne )
                  colonne = currcolonne;
          }
       }
    La funzione CountColonne(), in realtà, l'hai già scritta...
  • Re: C, contare righe e colonne matrice

    Per contare le righe devi considerare che la feof() è utile solo *dopo* che viene fatta la lettura con la fgets. E' questa la causa delle falsa lettura di una riga in più.

    Devi quindi scrivere
    
    righe=0;
    fgets( ... );
    while(!feof())
    {
       righe++;
       fgets( ... );
    }
    
Devi accedere o registrarti per scrivere nel forum
2 risposte