/Anonimizzato13981Utente anonimizzato16 feb 2014, 14:47Salve, devo leggere una matrice di caratteri da un file matrice.txt; 2 3 (righe, colonne) stz ykh dopo aver aperto il file creo una matrice alla quale assegno il contenuto del file in questa maniera char linea[colonne+1]; for(i = 0; i < riga; i++) { //leggo le righe della matrice e le assegno alla stringa "linea" fscanf(fp, "%s", linea); //leggo i caratteri della stringa al variare di j e li inserisco nella matrice for(j = 0; j < c; j++) { T[j] = riga[j]; } } e il tutto funziona. Ma se volessi leggere carattere per carattere il contenuto del file matrice.txt e assegnare ogni singolo carattere ai corrispondenti elementi della matrice con un'operazione tipo questa char ch; for(i=0;i<righe;i++){ for(j=0;j<colonne;j++){ fscanf(fp, "%c",&ch); T[j]=ch; } } quale correzione dovrei apportare in quanto facendo girare l'algoritmo e stampando a video i valori della matrice letta il risultato è questo st z y z Sicuramente c'entra qualcosa il ritorno a capo. Grazie se potete darmi una mano.
OoregonSuper FamosoIscritto danov, 2011Messaggi2191716 feb 2014, 14:58Potresti scrivere for(i=0;i<righe;i++) for(j=0;j<colonne;j++) fscanf(fp, "%c\n", &T[i][j]);
/Anonimizzato13981Utente anonimizzato16 feb 2014, 16:48Facendo cosi for(i=0;i<righe;i++) for(j=0;j<colonne;j++) fscanf(fp, "%c\n", &T[j]); mi stampa st zyk dovrebbe stampare stz ykh
/Anonimizzato12485Utente anonimizzato16 feb 2014, 17:00Potresti provare così, visto che le righe e le colonne dovrebbero esserti note a priori: for(i=0;i<N;i++) for(j=0;j<M;j++) if( ( c=getc(file) ) != '\n') m[i][j]=c; for(i=0;i<N;i++) { for(j=0;j<M;j++) putchar(m[i][j]); putchar('\n'); }
/Anonimizzato13981Utente anonimizzato16 feb 2014, 17:29Nell'ultimo modo che mi hai indicato non funziona, facendo cosi char ch; fscanf(fp,"%c", &ch); for(i=0;i<r;i++){ for(j=0;j<c;j++){ fscanf(fp,"%c\n", &T[j]); } } pero vorrei capire dal punto di vista informatico perche in questo modo gira, ossia facendo l'fscanf del primo carattere che trovo nella matrice
OoregonSuper FamosoIscritto danov, 2011Messaggi2191716 feb 2014, 18:33Come ti avevo indicato io funzionava regolarmente. Dipende tutto dal file che hai in input. Se ce lo fai scaricare si può capire il motivo.
/Anonimizzato13863Utente anonimizzato16 feb 2014, 18:57Il file di testo è cosi fatto 2 3 stk ykh nella prima riga sono scritte il n. Di righe (2)della matrice di caratteri e le relative colonne (3). Il resto sono gli elementi della matrice m01=s m02= t m03=k ecc
OoregonSuper FamosoIscritto danov, 2011Messaggi2191716 feb 2014, 19:54Ma il codice completo che stai usando ora qual è? Soprattutto, dove e come leggi il numero di righe e colonne prima di leggere i caratteri? Se le leggi così fscanf(fp, "%d %d\n", &righe, &colonne); e poi utilizzi le 3 righe che ti ho indicato per leggere i caratteri, dovrebbe andare.
/Anonimizzato13981Utente anonimizzato16 feb 2014, 22:43Ecco il codice completo #include <stdio.h> #include <stdlib.h> #include <string.h> int main () { int r, c, i, j; //APERTURA FILE FILE *fp; fp= fopen("matrice.txt", "r"); if(fp==NULL){ printf("Impossibile aprire il file matrice.txt\n"); return EXIT_FAILURE; } //LETTURA RIGHE E COLONNE fscanf(fp, "%d", &r); fscanf(fp, "%d", &c); //ALLOCAZIONE DINAM. MATRICE char **T; T= (char**) malloc(sizeof(char *)*r); //controllo allocazione righe if(T==NULL){ printf("Impossibile allocare le righe\n"); return EXIT_FAILURE; } for(i=0;i<r;i++) { T= (char*) malloc(sizeof(char)*c); //controllo allocazione colonne if(T==NULL){ printf("Impossibile allocare le colonne\n"); return EXIT_FAILURE; } } // CARICAMENTO DELLA MATRICE "T" coi dai presenti in matrice.txt for(i=0;i<r;i++){ for(j=0;j<c;j++){ fscanf(fp,"%c\n", &T[j]); } } // CHIUSURA FILE fclose(fp); //STAMPA A VIDEO DELLA MATRICE printf("MATRICE T\n"); for(i=0;i<r;i++){ for(j=0;j<c;j++){ printf("%c", T[j]); } printf("\n"); } system ("pause"); return 0; }
OoregonSuper FamosoIscritto danov, 2011Messaggi2191717 feb 2014, 00:09Nell'input delle righe e colonne fscanf(fp, "%d", &r); fscanf(fp, "%d", &c); devi prevedere il \n così fscanf(fp, "%d", &r); fscanf(fp, "%d\n", &c); oppure, come ti avevo detto prima, scrivi una sola riga fscanf(fp, "%d %d\n", &r, &c);