Từ 1 tới 10 trên tổng số 10 kết quả

Đề tài: Không đọc được số nguyên từ file .txt

  1. #1
    Ngày gia nhập
    09 2011
    Bài viết
    3

    Mặc định Không đọc được số nguyên từ file .txt

    Trong BT về đồ thị thuật toán Dijkstra, có yêu cầu nhập vào ma trận trọng số đọc từ tập tin input.txt nhu sau:
    Đọc dữ liệu từ tập tin văn bản, cài thuật toán tìm đường đi ngắn nhất Dijkstra, xuất kết quả ra tập tin văn bản
    VD:
    Input.txt
    6

    0 6 0 4 0 0

    6 0 5 3 0 0

    0 5 0 3 2 2

    4 3 3 0 9 0

    0 0 2 9 0 3

    0 0 2 0 3 0

    1 6
    Output.txt
    9

    6 <- 3 <- 4 <- 1

    Trong đó 1 và 6 ở dòng cuối cùng là điểm đầu và điểm cuối cần tìm đường đi ngắn nhất.

    Em đã làm như sau:
    #include "stdio.h"
    #include "conio.h"
    # define MAX 100
    #define VOCUC -1
    struct GRAPH {
    int n;
    int D[MAX][MAX];// Ma tran trong so
    };
    int nT;//so dinh cua do thi
    int T[MAX];
    int L[MAX];
    int Prev[MAX];
    void MaTranDauVao(char TenFile[],GRAPH &g)
    {
    int dinhDau;
    int dinhCuoi;
    FILE *f;
    f = fopen(TenFile, "r"); // (1)
    if(f == NULL) // (2)
    {
    printf("Khong doc duoc file\n");
    fclose(f);
    return;
    }

    fscanf(f,"%d",&g.n);
    nT=g.n;
    for(int i=0; i<g.n; i++)
    { for(int j=0; j<g.n; j++)

    fscanf(f, "%d", &g.D[i][j]); // (3)
    }
    fscanf(f,"%d %d",&dinhDau,&dinhCuoi);
    fclose(f); // (4)
    }
    void Init(GRAPH g, int dinhDau)
    {
    nT=g.n;
    for (int i=0; i<g.n;i++)
    {T[i]=1;
    L[i]=VOCUC;
    Prev[i]=-1;
    }
    L[dinhDau]=0;

    }
    void DijkstraAlg(GRAPH g,int dinhDau, int dinhCuoi)
    {
    Init(g,dinhDau);//goi ham Init
    // Trong khi dinh cuoi van trong T
    while(T[dinhCuoi]==1)
    {
    int min =VOCUC;// chua tim thay dinh nho nhat
    int v=-1;//????
    for (int i=0;i<g.n;i++)
    if (T[i]==1&&min==VOCUC||min>=L[i])
    {
    min=L[i];//????
    v=i;
    //Neu khong tim thay, dung thuat toan, ket luan khong co duong di tu
    }
    if (v==-1)
    break;
    T[v]=0;
    // Duyet cac dinh co canh noi tu v den
    for (int k=0; k<g.n;k++)
    if (g.D[v][k]>0&&T[k]==1&&L[k]==VOCUC||L[k]>L[v]+g.D[v][k])
    {
    L[k]= L[v]+g.D[v][k];

    Prev[k]=v;
    }

    }
    }

    void Print(int L[], int Prev[], int dinhDau, int dinhCuoi, char tenFile[])
    {
    FILE* f;
    f = fopen(tenFile, "w");
    if(f == NULL)
    {
    printf("Khong tao duoc file\n");
    return;
    }
    fprintf(f, "%d\n", L[dinhCuoi]);
    int x= dinhCuoi;
    fprintf(f, "%d", x);
    do{
    x = Prev[x];
    fprintf(f, " <- %d", x);
    } while (x != dinhDau);
    fclose(f);
    }
    void main()
    {GRAPH g;
    int dinhDau;
    int dinhCuoi;

    MaTranDauVao("Input.txt",g);
    DijkstraAlg(g, dinhDau,dinhCuoi);
    Print(L,Prev, dinhDau, dinhCuoi,"1081304.txt");
    }
    Kki chạy máy báo lỗi: Run-Time Check Failure #3 - The variable 'dinhCuoi' is being used without being initialized.
    Khi kiểm tra debug /Step into thì thấy máy không đọc được 2 giá trị ở dòng cuối cùng dưới ma trận trọng số mà không biết nguyên nhân ra sao. Rất mong các anh/chị hướng dẫn em. Thanks
    Đã được chỉnh sửa lần cuối bởi nguyenanh396 : 22-03-2012 lúc 05:55 PM. Lý do: Theo đề nghị bác clchicken

  2. #2
    Ngày gia nhập
    12 2009
    Bài viết
    74

    Thử bỏ dấu cách trong câu lệnh: fscanf(f,"%d %d",&dinhDau,&dinhCuoi); xem sao
    Máy mình hỏng nên ko bug được. Đoán vậy. ko biết có đúng ko

  3. #3
    Ngày gia nhập
    10 2011
    Bài viết
    552

    Sao ko đưa tên lỗi và hiện trạng lỗi lên luôn
    Tự dưng cái nói "Không đọc được" ? Ai bik là ra làm sao

    Nếu cậu đưa cái hiện trạng lỗi lên + cái khai báo biến ở câu lệnh bị lỗi (biến đó mọc ở đâu ra) + cái cấu trúc GRAPH của cậu là cái gì thì có lẽ cậu đã sớm nhận dc câu trả lời
    Hỏi chung chung thế này chịu. Ko có nhiều thời gian để mà ngồi đoán mò
    Um Mani Padme Hum...!!

  4. #4
    Ngày gia nhập
    09 2011
    Bài viết
    3

    Trích dẫn Nguyên bản được gửi bởi Mr.Quit Xem bài viết
    Thử bỏ dấu cách trong câu lệnh: fscanf(f,"%d %d",&dinhDau,&dinhCuoi); xem sao
    Máy mình hỏng nên ko bug được. Đoán vậy. ko biết có đúng ko
    Thanks bác. Em đã thử trước rồi nhưng không phải thế đâu

  5. #5
    Ngày gia nhập
    07 2011
    Bài viết
    160

    Bạn đọc đỉnh đầu và đỉnh cuối vào 2 biến cục bộ trong hàm đọc đó chứ. 2 biến đó có liên quan gì đến 2 biến trong main đâu

  6. #6
    Ngày gia nhập
    02 2012
    Bài viết
    4

    Mặc định Không đọc được số nguyên từ file .txt

    Sửa code trên thành:
    Code:
    #include "stdio.h" 
    #include "conio.h"
    # define MAX 100
    #define VOCUC -1
    struct GRAPH {
    int n;
    int D[MAX][MAX];// Ma tran trong so
    };
    int nT;//so dinh cua do thi
    int T[MAX];
    int L[MAX];
    int Prev[MAX];
    void MaTranDauVao(char TenFile[],GRAPH &g) 
    { 
    int dinhDau;
    int dinhCuoi;
    FILE *f; 
    f = fopen(TenFile, "r"); // (1) 
    if(f == NULL) // (2) 
    { 
    printf("Khong doc duoc file\n"); 
    fclose(f); 
    return; 
    }
    
    fscanf(f,"%d",&g.n);
    nT=g.n;
    for(int i=0; i<g.n; i++) 
    { for(int j=0; j<g.n; j++)
    
    fscanf(f, "%d", &g.D[i][j]); // (3) 
    }
    fscanf(f,"%d %d",&dinhDau,&dinhCuoi);
    fclose(f); // (4) 
    }
    void Init(GRAPH g, int dinhDau)
    {
    nT=g.n;
    for (int i=0; i<g.n;i++)
    {T[i]=1;
    L[i]=VOCUC;
    Prev[i]=-1;
    }
    L[dinhDau]=0;
    
    }
    void DijkstraAlg(GRAPH g,int & dinhDau, int & dinhCuoi)
    {
    Init(g,dinhDau);//goi ham Init
    // Trong khi dinh cuoi van trong T
    while(T[dinhCuoi]==1)
    {
    int min =VOCUC;// chua tim thay dinh nho nhat
    int v=-1;//????
    for (int i=0;i<g.n;i++)
    if (T[i]==1&&min==VOCUC||min>=L[i])
    {
    min=L[i];//????
    v=i;
    //Neu khong tim thay, dung thuat toan, ket luan khong co duong di tu
    }
    if (v==-1)
    break;
    T[v]=0;
    // Duyet cac dinh co canh noi tu v den
    for (int k=0; k<g.n;k++)
    if (g.D[v][k]>0&&T[k]==1&&L[k]==VOCUC||L[k]>L[v]+g.D[v][k])
    {
    L[k]= L[v]+g.D[v][k];
    
    Prev[k]=v;
    }
    
    }
    }
    
    void Print(int L[], int Prev[], int dinhDau, int dinhCuoi, char tenFile[])
    {
    FILE* f;
    f = fopen(tenFile, "w");
    if(f == NULL)
    {
    printf("Khong tao duoc file\n");
    return;
    }
    fprintf(f, "%d\n", L[dinhCuoi]);
    int x= dinhCuoi;
    fprintf(f, "%d", x);
    do{
    x = Prev[x];
    fprintf(f, " <- %d", x);
    } while (x != dinhDau);
    fclose(f);
    }
    void main()
    {GRAPH g;
    int dinhDau;
    int dinhCuoi;
    
    MaTranDauVao("Input.txt",g);
    DijkstraAlg(g, dinhDau,dinhCuoi);
    Print(L,Prev, dinhDau, dinhCuoi,"1081304.txt");
    }
    Khi đó sẽ đc ^^

    nguyên nhân như sau:
    bạn đưa dinhDau và dinhCuoi vào hàm dijkstraAlg(), hàm này thực ra ko thao tác trên 2 biến đó mà thao tác trên "bản copy" của 2 biến đó (bản copy này ở dạng local), do đó sau khi hết hàm dijkstraAlg, biến dinhDau và dinhCuoi vẫn như cũ trước khi gọi dijkstraAlg (chưa được gán giá trị - tức not initialized).
    Cách giải quyết là thêm "&" vào trong definition của tham số đó trong hàm để dijkstraAlg thao tác trực tiếp trên reference của dinhDau và dinhCuoi.

  7. #7
    Ngày gia nhập
    09 2011
    Bài viết
    3

    Trích dẫn Nguyên bản được gửi bởi phaikawl Xem bài viết
    Sửa code trên thành:
    Code:
    #include "stdio.h" 
    #include "conio.h"
    # define MAX 100
    #define VOCUC -1
    struct GRAPH {
    int n;
    int D[MAX][MAX];// Ma tran trong so
    };
    int nT;//so dinh cua do thi
    int T[MAX];
    int L[MAX];
    int Prev[MAX];
    void MaTranDauVao(char TenFile[],GRAPH &g) 
    { 
    int dinhDau;
    int dinhCuoi;
    FILE *f; 
    f = fopen(TenFile, "r"); // (1) 
    if(f == NULL) // (2) 
    { 
    printf("Khong doc duoc file\n"); 
    fclose(f); 
    return; 
    }
    
    fscanf(f,"%d",&g.n);
    nT=g.n;
    for(int i=0; i<g.n; i++) 
    { for(int j=0; j<g.n; j++)
    
    fscanf(f, "%d", &g.D[i][j]); // (3) 
    }
    fscanf(f,"%d %d",&dinhDau,&dinhCuoi);
    fclose(f); // (4) 
    }
    void Init(GRAPH g, int dinhDau)
    {
    nT=g.n;
    for (int i=0; i<g.n;i++)
    {T[i]=1;
    L[i]=VOCUC;
    Prev[i]=-1;
    }
    L[dinhDau]=0;
    
    }
    void DijkstraAlg(GRAPH g,int & dinhDau, int & dinhCuoi)
    {
    Init(g,dinhDau);//goi ham Init
    // Trong khi dinh cuoi van trong T
    while(T[dinhCuoi]==1)
    {
    int min =VOCUC;// chua tim thay dinh nho nhat
    int v=-1;//????
    for (int i=0;i<g.n;i++)
    if (T[i]==1&&min==VOCUC||min>=L[i])
    {
    min=L[i];//????
    v=i;
    //Neu khong tim thay, dung thuat toan, ket luan khong co duong di tu
    }
    if (v==-1)
    break;
    T[v]=0;
    // Duyet cac dinh co canh noi tu v den
    for (int k=0; k<g.n;k++)
    if (g.D[v][k]>0&&T[k]==1&&L[k]==VOCUC||L[k]>L[v]+g.D[v][k])
    {
    L[k]= L[v]+g.D[v][k];
    
    Prev[k]=v;
    }
    
    }
    }
    
    void Print(int L[], int Prev[], int dinhDau, int dinhCuoi, char tenFile[])
    {
    FILE* f;
    f = fopen(tenFile, "w");
    if(f == NULL)
    {
    printf("Khong tao duoc file\n");
    return;
    }
    fprintf(f, "%d\n", L[dinhCuoi]);
    int x= dinhCuoi;
    fprintf(f, "%d", x);
    do{
    x = Prev[x];
    fprintf(f, " <- %d", x);
    } while (x != dinhDau);
    fclose(f);
    }
    void main()
    {GRAPH g;
    int dinhDau;
    int dinhCuoi;
    
    MaTranDauVao("Input.txt",g);
    DijkstraAlg(g, dinhDau,dinhCuoi);
    Print(L,Prev, dinhDau, dinhCuoi,"1081304.txt");
    }
    Khi đó sẽ đc ^^

    nguyên nhân như sau:
    bạn đưa dinhDau và dinhCuoi vào hàm dijkstraAlg(), hàm này thực ra ko thao tác trên 2 biến đó mà thao tác trên "bản copy" của 2 biến đó (bản copy này ở dạng local), do đó sau khi hết hàm dijkstraAlg, biến dinhDau và dinhCuoi vẫn như cũ trước khi gọi dijkstraAlg (chưa được gán giá trị - tức not initialized).
    Cách giải quyết là thêm "&" vào trong definition của tham số đó trong hàm để dijkstraAlg thao tác trực tiếp trên reference của dinhDau và dinhCuoi.
    Thanks anh.

  8. #8
    Ngày gia nhập
    02 2012
    Nơi ở
    Thủ Đức
    Bài viết
    19

    Hix mình muốn read các số nguyên từ file ai biết chỉ mình với:
    VD trong file .txt có nội dung sau:
    cac phan tu cua mang la: 2 4 1 2 4
    mình muốn lấy 5 số này ra nhưng mà nó đọc luôn cả kí tự char nên mình ko lấy ra đc và bị lỗi
    mình dùng fscanf(fp,"%d",&a[i]);
    lấy 5 phần tử rồi lưu vào mảng nhưng bị lỗi.help mình với:(

  9. #9
    Ngày gia nhập
    03 2011
    Bài viết
    44

    Trích dẫn Nguyên bản được gửi bởi SolitaryWolf Xem bài viết
    Hix mình muốn read các số nguyên từ file ai biết chỉ mình với:
    VD trong file .txt có nội dung sau:
    cac phan tu cua mang la: 2 4 1 2 4
    mình muốn lấy 5 số này ra nhưng mà nó đọc luôn cả kí tự char nên mình ko lấy ra đc và bị lỗi
    mình dùng fscanf(fp,"%d",&a[i]);
    lấy 5 phần tử rồi lưu vào mảng nhưng bị lỗi.help mình với:(
    Cái này bạn có thể dùng như sau:
    Đọc dữ liệu một file và xuất ra file khác, còn nếu muốn xuất ra màn hình thì bỏ dòng 6.
    C++ Code:
    1. #include "iostream"
    2. using namespace std;
    3. int main()
    4. {
    5.      freopen("input.txt", "r", stdin);
    6.      freopen("output.txt","w", stdout); // Nếu xuất ra màn hình thì bỏ dòng này.
    7.      int n;
    8.      cin>>n;
    9.      int a[100];
    10.      for(int i=0;i<n;i++) cin>> a[i];
    11.      for(int i=0;i<n;i++) cout<< a[i] << " ";
    12.      system("pause");
    13.      return 0;
    14. }

  10. #10
    Ngày gia nhập
    01 2015
    Bài viết
    1

    Trích dẫn Nguyên bản được gửi bởi phaikawl Xem bài viết
    Sửa code trên thành:
    Code:
    #include "stdio.h" 
    #include "conio.h"
    # define MAX 100
    #define VOCUC -1
    struct GRAPH {
    int n;
    int D[MAX][MAX];// Ma tran trong so
    };
    int nT;//so dinh cua do thi
    int T[MAX];
    int L[MAX];
    int Prev[MAX];
    void MaTranDauVao(char TenFile[],GRAPH &g) 
    { 
    int dinhDau;
    int dinhCuoi;
    FILE *f; 
    f = fopen(TenFile, "r"); // (1) 
    if(f == NULL) // (2) 
    { 
    printf("Khong doc duoc file\n"); 
    fclose(f); 
    return; 
    }
    
    fscanf(f,"%d",&g.n);
    nT=g.n;
    for(int i=0; i<g.n; i++) 
    { for(int j=0; j<g.n; j++)
    
    fscanf(f, "%d", &g.D[i][j]); // (3) 
    }
    fscanf(f,"%d %d",&dinhDau,&dinhCuoi);
    fclose(f); // (4) 
    }
    void Init(GRAPH g, int dinhDau)
    {
    nT=g.n;
    for (int i=0; i<g.n;i++)
    {T[i]=1;
    L[i]=VOCUC;
    Prev[i]=-1;
    }
    L[dinhDau]=0;
    
    }
    void DijkstraAlg(GRAPH g,int & dinhDau, int & dinhCuoi)
    {
    Init(g,dinhDau);//goi ham Init
    // Trong khi dinh cuoi van trong T
    while(T[dinhCuoi]==1)
    {
    int min =VOCUC;// chua tim thay dinh nho nhat
    int v=-1;//????
    for (int i=0;i<g.n;i++)
    if (T[i]==1&&min==VOCUC||min>=L[i])
    {
    min=L[i];//????
    v=i;
    //Neu khong tim thay, dung thuat toan, ket luan khong co duong di tu
    }
    if (v==-1)
    break;
    T[v]=0;
    // Duyet cac dinh co canh noi tu v den
    for (int k=0; k<g.n;k++)
    if (g.D[v][k]>0&&T[k]==1&&L[k]==VOCUC||L[k]>L[v]+g.D[v][k])
    {
    L[k]= L[v]+g.D[v][k];
    
    Prev[k]=v;
    }
    
    }
    }
    
    void Print(int L[], int Prev[], int dinhDau, int dinhCuoi, char tenFile[])
    {
    FILE* f;
    f = fopen(tenFile, "w");
    if(f == NULL)
    {
    printf("Khong tao duoc file\n");
    return;
    }
    fprintf(f, "%d\n", L[dinhCuoi]);
    int x= dinhCuoi;
    fprintf(f, "%d", x);
    do{
    x = Prev[x];
    fprintf(f, " <- %d", x);
    } while (x != dinhDau);
    fclose(f);
    }
    void main()
    {GRAPH g;
    int dinhDau;
    int dinhCuoi;
    
    MaTranDauVao("Input.txt",g);
    DijkstraAlg(g, dinhDau,dinhCuoi);
    Print(L,Prev, dinhDau, dinhCuoi,"1081304.txt");
    }
    Khi đó sẽ đc ^^

    nguyên nhân như sau:
    bạn đưa dinhDau và dinhCuoi vào hàm dijkstraAlg(), hàm này thực ra ko thao tác trên 2 biến đó mà thao tác trên "bản copy" của 2 biến đó (bản copy này ở dạng local), do đó sau khi hết hàm dijkstraAlg, biến dinhDau và dinhCuoi vẫn như cũ trước khi gọi dijkstraAlg (chưa được gán giá trị - tức not initialized).
    Cách giải quyết là thêm "&" vào trong definition của tham số đó trong hàm để dijkstraAlg thao tác trực tiếp trên reference của dinhDau và dinhCuoi.
    Bài này sao chạy nó vẫn báo lỗi Unhandled exception...Access violation writing location. Xem Watch thì : dinhCuoi identifier "dinhCuoi" is undefined là sao nhỉ ?

Các đề tài tương tự

  1. Nguyên tắc của cắt nối file âm thanh, hình ảnh như thế nào?
    Gửi bởi dangngocduc.bk trong diễn đàn Thắc mắc chung
    Trả lời: 1
    Bài viết cuối: 11-07-2013, 08:29 PM
  2. Bài tập C++ Cách đọc file txt chứa các số nguyên và ký tự đặc biệt
    Gửi bởi hoangyen188 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 12
    Bài viết cuối: 05-07-2012, 12:18 AM
  3. Ghi số nguyên tố vào file
    Gửi bởi teotoni trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 10
    Bài viết cuối: 19-05-2011, 12:48 AM
  4. Bài tập C++ Đọc file và ghi file cho bài tập list các số nguyên?
    Gửi bởi lonelyboy_101 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 6
    Bài viết cuối: 26-09-2010, 09:01 PM
  5. Bai tap ve file!Tạo một file text trong đó mỗi dòng lưu 3 số nguyên
    Gửi bởi sonsdc trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 2
    Bài viết cuối: 06-03-2009, 10:59 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn