2015-04-15 60 views
6

Tôi đang cố đọc một tệp văn bản và lưu trữ dữ liệu trong ma trận. Tôi in kết quả sau khi đọc từng dòng và có vẻ như nó đang hoạt động, nhưng nếu tôi in ma trận ở cuối, tôi không có kết quả tương tự. Tôi không thể tìm thấy những gì tôi đang làm sai!Đọc ma trận từ tệp văn bản trong 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; 
} 

Đây là sản phẩm của chương trình:

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

Vui lòng tra cứu SO cho câu trả lời trước khi hỏi. Câu hỏi này hoặc một cái gì đó rất giống nhau đã được hỏi, và trả lời, nhiều lần trước đây. Vấn đề của bạn là 'double value [10000] [2];' và 'fscanf (archivo,"% lf% lf% lf ", & value [i] [0], & value [i] [1], & value [i] [ 2]); '- bạn truy cập vào mảng ngoài giới hạn và ghi đè lên nội dung. –

+2

'while (feof (archivo) == 0)' - vui lòng tham khảo câu hỏi SO http://stackoverflow.com/questions/5431941/why-is-while-feof-file-always-wrong/5432004 Bạn cũng nên kiểm tra giá trị trả về từ 'fscanf()', trong trường hợp này 'if (3! = fscanf (...))' –

+1

Thay vì 'while (! feof (archivo))' sẽ là 'true' một lần sau dòng được đọc, bạn có thể làm 'while (fscanf (...) == 3)' không chỉ đảm bảo rằng vòng lặp sẽ thực hiện đúng số lần lặp, mà còn là dòng chứa dữ liệu được định dạng tốt. Trong thực tế 'printf()' ngay sau 'fscanf()' có khả năng gọi hành vi không xác định. –

Trả lời

6

Bạn khai báo double value[10000][2]; nhưng sau đó truy cập value[i][2]. Mảng được khai báo với [2] chứa 2 phần tử, được lập chỉ mục 01. Việc truy cập chỉ mục '2' sẽ ghi đè bộ nhớ khác.

Sử dụng

double value[10000][3]; 
Các vấn đề liên quan