2015-04-15 8 views
6

Sto cercando di leggere un file di testo e memorizzare i dati in una matrice. Stampo i risultati dopo aver letto ogni riga e sembra che funzioni, ma se stampo la matrice alla fine, non ho gli stessi risultati. Non riesco a trovare quello che sto facendo male!Lettura di una matrice da un file di testo in c

int main() 
{ 
    int i,j; 
    double value[10000][2]; 
    FILE *archivo; 
    archivo = fopen("pruebas.txt","r"); 
    if (archivo == NULL) 
     exit(1); 
    i=0; 
    while (feof(archivo) == 0) 
    { 
     fscanf(archivo, "%lf %lf %lf", &value[i][0],&value[i][1],&value[i][2]); 
     printf("%10.0f %f %f\n", value[i][0], value[i][1], value[i][2]); 
     i++; 
    } 

    printf("Your matrix:\n"); 
    for(j = 0; j < i; j++) 
     printf("%10.0f %10.3f %10.3f\n", value[j][0], value[j][1], value[j][2]); 

    fclose(archivo); 
    return 0; 
} 

Questo è l'output del programma:

1 2 3 
4 5 6 
7 8 9 
Your matrix: 
1 2 4 
4 5 7 
7 8 9 
+2

Si prega di cercare SO per la risposta prima di chiedere. Questa domanda o qualcosa di molto simile è stata posta e risposta molte volte in passato. Il tuo problema è 'doppio valore [10000] [2];' e 'fscanf (archivo,"% lf% lf% lf ", e valore [i] [0], e valore [i] [1], e valore [i] [ 2]); '- si accede alla matrice fuori dai limiti e si sovrascrivono le cose. –

+2

'while (feof (archivo) == 0)' - si prega di fare riferimento alla domanda SO http://stackoverflow.com/questions/5431941/why-is-while-feof-file-always-wrong/5432004 Si dovrebbe anche controllare il valore restituito da 'fscanf()', in questo caso 'if (3! = fscanf (...))' –

+1

Invece di 'while (! feof (archivo))' che sarà 'true' una volta dopo l'ultima linea è letta, si può fare 'while (fscanf (...) == 3)' che non solo assicura che il ciclo eseguirà il numero corretto di iterazioni, ma anche che la linea contenga dati ben formulati. Infatti 'printf()' subito dopo 'fscanf()' richiama potenzialmente un comportamento indefinito. –

risposta

6

si dichiara double value[10000][2]; ma poi accedere value[i][2]. Un array dichiarato con [2] contiene 2 elementi, indicizzati 0 e 1. L'accesso all'indice '2' sovrascrive l'altra memoria.

Usa

double value[10000][3]; 
Problemi correlati