2015-04-15 22 views
6

Ich versuche eine Textdatei zu lesen und die Daten in einer Matrix zu speichern. Ich drucke die Ergebnisse nach dem Lesen jeder Zeile und scheint es funktioniert, aber wenn ich die Matrix am Ende drucken, habe ich nicht die gleichen Ergebnisse. Ich kann nicht finden, was ich falsch mache!Lesen einer Matrix aus einer Textdatei 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; 
} 

Dies ist die Ausgabe des Programms:

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

Bitte suchen Sie auf SO für die Antwort, bevor er fragte. Diese Frage oder etwas Ähnliches wurde schon oft gestellt und beantwortet. Ihr Problem ist "double value [10000] [2];" und "fscanf (archivo,"% lf% lf% lf ", & value [i] [0], & value [i] [1], & value [i] [ 2]); '- Zugriff auf das Array außerhalb der Grenzen und Überschreiben von Daten. –

+2

'while (feof (archivo) == 0)' - Bitte beziehen Sie sich auf SO Frage http://StackOverflow.com/Questions/5431941/Why-is-Whea-feof-File-Always-Wrong/5432004 Sie sollten auch überprüfen der Rückgabewert von 'fscanf()', in diesem Fall 'if (3! = fscanf (...)) ' –

+1

Anstelle von' while (! feof (archivo)) ', das nach dem letzten' wahr 'sein wird Zeile wird gelesen, Sie können 'while (fscanf (...) == 3)' tun, was nicht nur sicherstellt, dass die Schleife die korrekte Anzahl von Iterationen ausführt, sondern auch, dass die Zeile gut formatierte Daten enthält. In der Tat ruft 'printf()' direkt nach 'fscanf()' möglicherweise undefiniertes Verhalten auf. –

Antwort

6

Sie erklären double value[10000][2]; aber dann value[i][2] zugreifen. Ein mit [2] deklariertes Array enthält 2 Elemente, indexiert 0 und 1. Der Zugriff auf den Index '2' überschreibt anderen Speicher.

Verwenden

double value[10000][3]; 
Verwandte Themen