Lettura matrice di caratteri da file esterno

di Anonimizzato13981 il
11 risposte
Salve, 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.

11 Risposte

  • Potresti scrivere
    
    	for(i=0;i<righe;i++)
    		for(j=0;j<colonne;j++)
    			fscanf(fp, "%c\n", &T[i][j]);
    
  • Facendo 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
  • Potresti 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');
        }
  • Nell'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
  • Come ti avevo indicato io funzionava regolarmente.

    Dipende tutto dal file che hai in input. Se ce lo fai scaricare si può capire il motivo.
  • Il 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
  • Ma 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.
  • Ecco 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;
    }
  • Nell'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);
  • Ok perfetto ora funziona
    grazie gentilissimo
  • Grazie anche da parte mia!
Devi accedere o registrarti per scrivere nel forum
11 risposte