PDA

Visualizza la versione completa : [C] Lettura matrice di dimensioni non note


franalotto94
28-06-2014, 11:53
Buongiorno,
Dovrei leggere una matrice da file di cui ho le dimensioni massime ma non le dimensioni effettive , ovvero so che la matrice possa essere al massimo NxM ma in realtà potrebbe essere più piccola .
Non voglio utilizzare malloc (anche se penso che qui non sia strettamente necessario;
Ho provato a risolvere il problema utilizzando la funzione isalpha() della lib. ctype.
Riuscendo soltanto a trovare le dimensioni della colonna ma non quella delle righe , di seguito allego il codice , razie in anticipo




#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define R_MAX 25
#define C_MAX 25






int main(int argc,char**argv)
{
char matrice[R_MAX][C_MAX];
int i,r,q,col;
char c='a',v='e';
FILE *fp;



if(argc!=2)
{
fprintf(stderr,"Errore sintassi\n");
return 1;
}



if ((fp=fopen(argv[1],"r"))==NULL)
{
fprintf(stderr,"errore apertura file\n");
return(1);
}




for(i=0;i<R_MAX;i++)
{
for(q=0;q<C_MAX;q++)
{ c=getc(fp);
if(!(isalpha(c))&&c=='\n')
{
col=q;
q=C_MAX;
}
matrice[i][q]=c;

}
}
}

oregon
28-06-2014, 13:09
Non ho capito perché pensi di usare la isalpha ...

Come è fatto il file? Come sono scritti i valori dentro?

E se non usi la malloc come pensi di allocare lo spazio esatto?

franalotto94
28-06-2014, 16:34
Avendo le dimensioni massime della matrice so che la matrice non eccede quelle dimensioni !
Uso isalpha in modo da arrivare al carattere new line ed avere il numero effettivo delle colonne !
per le righe avrei potuto usare un while( fscanf !=EOF) e mettere un contatore sotto in modo da ottenere anche il numero di righe e poi usare la funzione rewind dell file pointer ?


Non uso la malloc perché anche usando un 1000x1000 non mi inficia nel programma che devo fare ,certo non e la soluzione migliore ma per l allocazione dinamica non mi sento ancora pronto



Un sample del file è questo


asddfkgkhkj
fjgjhkhkhkj
ngnnvnbbbbb
gjgjhjjjjjj

oregon
28-06-2014, 17:08
Dato che ogni riga è fatta da una sequenza di caratteri ti suggerisco di usare la fscanf (con un vettore di char temporaneo) per le righe e una strlen per colonne.

Alla fine del ciclo puoi chiudere e riaprire il file o riportare all'inizio il puntatore, come preferisci.

franalotto94
28-06-2014, 17:16
Grazie mille per l aiuto quindi se ho capito bene dovrei fare una cosa del genere,

char stringa[max+1];

fp=fopen(....)
while(fscanf(fp,"%s",stringa)!=EOF
{ i++;\\ dimensione righe
}


x=strlen(stringa);\\ ottengo cosi il numero di colonne ma la dimensione effettiva sarà x-1 considerando il new line al termine di ogni riga?

oregon
28-06-2014, 18:18
Fai qualche prova ...

Loading