PDA

Visualizza la versione completa : [C-C++] Lettura file testo di interi


WalterP
08-02-2012, 11:36
Salve, stavo tentando di fare un programmino che leggesse un file di interi strutturato in questo modo:


3,5
1 1 1 , 2 2 2 , 3 3 3 , 4 4 4 , 5 5 5
11 11 11 , 22 22 22 , 33 33 33 , 44 44 44 , 55 55 55
111 111 111 , 222 222 222 , 333 333 333 , 444 444 444 , 555 555 555

3,7
1 1 1 , 2 2 2 , 3 3 3 , 4 4 4 , 5 5 5 , 6 6 6 , 7 7 7
11 11 11 , 22 22 22 , 33 33 33 , 44 44 44 , 55 55 55 , 66 66 66 , 77 77 77
111 111 111 , 222 222 222 , 333 333 333 , 444 444 444 , 555 555 555 , 665 665 665 , 777 777 777

....


quindi il file contiene delle matrici di interi (anche negativi) dove la prima riga contiene la dimensione della prima matrice e poi la matrice stessa, dove ogni elemento della matrice costituito da tre numeri;

Ho iniziato a fare un programmino ma ho trovato un problema,
una volta letti i valori di numero di righe e colonne vorrei scorrere la matrice fino alla fine della riga (\n)

Quindi faccio cos:


while (vir!='\n') {
fscanf(myfile,"%d %d %d %c",&xx,&yy,&zz,&vir);
...
Con questo prendo gli elementi a tre a tre e anche la virgola che separa i gruppi di elementi, va bene per tutti i gruppi della matrice tranne l'ultimo! Ad esempio una volta attraversata tutta la prima riga il valore che mi torna la fscanf il seguente:
"5 5 5 1" dove l'uno il primo carattere della riga successiva! Perch non mi trova lo '\n'?? Nel file c' l'acapo!

Aiutatemi grazie!

ramy89
08-02-2012, 13:15
Meglio se posti il codice completo.

WalterP
08-02-2012, 13:29
Originariamente inviato da ramy89
Meglio se posti il codice completo.

si, comunque girando un p per il web ho scoperto che la fscanf non rileva il carattere speciale '\n', sto prendendo un'altra strada non molto pulita. Ho fatto progressi, nel caso in cui dovessi riuscirci posto tutto il codice e magari vediamo di pulirlo! Grazie comunque!

WalterP
08-02-2012, 14:20
Questo il codice funzionante...




int main () {
int xx, yy ,zz;
int righe, colonne, count_col, count_matrix;
char vir,c;

count_matrix=2;
FILE * myfile;
myfile = fopen ("esempio.txt","r");

c=' ';//inizializzo
while (count_matrix!=0) //conta il numero di matrici che conosco a priori NON RIESCO A TROVARE L'EOF
{
count_matrix--;
fscanf(myfile,"%d",&righe);
fscanf(myfile,"%c",&vir);
fscanf(myfile,"%d",&colonne);
c= fgetc(myfile); // '\n'
cout << righe << " ++ "<< vir << " ++ "<< colonne << endl;

while (righe!=0) {
count_col=colonne;

while (count_col!=0) {
count_col--;
fscanf(myfile,"%d %d %d",&xx,&yy,&zz);
if (count_col==0) { // leggo lo '\n'
c= fgetc(myfile);
c=' ';}
else { //la riga non ancora finita e leggo ", "
c= fgetc(myfile);// ','
c= fgetc(myfile);// ' '
}
cout << count_col << endl;
cout << xx << " "<< yy << " "<< zz << " "<< endl;
}// fine colonne

righe--;
cout << "righe" << righe << endl;
//scanf("%c",&invio);
}//righe

}//count_matrix==0;
cout << "chiudo" << endl;
fclose (myfile);

return 0;
}


se non utilizzo il count_matrix continua a leggere dei valori strani e poi si ferma!
Possiamo vedere di pulirlo un p e semmai utilizzare anche l'EOF? Grazie per l'aiuto!... comunque cos funziona!

Loading