Lettura matrice di caratteri da file esterno

di il
11 risposte

Lettura matrice di caratteri da file esterno

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

  • Re: Lettura matrice di caratteri da file esterno

    Potresti scrivere
    
    	for(i=0;i<righe;i++)
    		for(j=0;j<colonne;j++)
    			fscanf(fp, "%c\n", &T[i][j]);
    
  • Re: Lettura matrice di caratteri da file esterno

    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
  • Re: Lettura matrice di caratteri da file esterno

    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');
        }
  • Re: Lettura matrice di caratteri da file esterno

    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
  • Re: Lettura matrice di caratteri da file esterno

    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.
  • Re: Lettura matrice di caratteri da file esterno

    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
  • Re: Lettura matrice di caratteri da file esterno

    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.
  • Re: Lettura matrice di caratteri da file esterno

    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;
    }
  • Re: Lettura matrice di caratteri da file esterno

    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);
  • Re: Lettura matrice di caratteri da file esterno

    Ok perfetto ora funziona
    grazie gentilissimo
  • Re: Lettura matrice di caratteri da file esterno

    Grazie anche da parte mia!
Devi accedere o registrarti per scrivere nel forum
11 risposte