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

Đề tài: Đọc ghi file nhị phân

  1. #1
    Ngày gia nhập
    04 2020
    Bài viết
    6

    Mặc định Đọc ghi file nhị phân

    Chào mọi người. Mình có 1 bài tập thế này:
    Viết chương trình tạo một menu thực hiện các công việc sau:
    a. Nhập danh sách liên kết theo giải thuật thêm về cuối danh sách, mỗi phần tử gồm có các thông tin sau: mssv (int), và ho, ten (char hoten[30]).
    b. Liệt kê danh sách ra màn hình
    c. Cho biết tổng số nút trong danh sách liên kết, đặt tên hàm là Reccount
    (int Reccount (NODEPTR First))
    d. Thêm 1 phần tử có nội dung info (mssv, hoten) vào sau phần tử có thứ tự thứ i trong danh sách.
    Ghi chú: - Thứ tự theo qui ước bắt đầu là 1
    - Nếu (i = 0) thêm vào đầu danh sách
    - Nếu i > Reccount(First) thì thêm vào cuối danh sách.
    e. In ra họ tên của sinh viên có mã do ta nhập vào.
    f. Loại bỏ nút có mã do ta nhập vào, trước khi xóa hỏi lại "Bạn thật sự muốn xóa (Y/N) ? "
    g. Sắp xếp lại danh sách theo thứ tự mã số tang dần.
    h. Ghi toàn bộ danh sách vào file tên 'DSSV.DAT'
    i. Nạp danh sách từ file 'DSSV.DAT' vào danh sách liên kết. Nếu trong danh sách liên kết đã có nút thì xóa tất cả dữ liệu hiện có trong danh sách liên kết trước khi đưa dữ liệu từ file vào.
    Đây là code của mình. Nó chạy được và đúng hết, chỉ có vấn đề nằm ở phần đọc ghi file. Khi mình nhập dữ liệu rồi ghi vào file, sau đó đọc rồi xuất ra màn hình thì người cuối cùng được nhập trong danh sách luôn được copy lại thành 1 người nữa. Chẳng hạn mình nhập người 1 và 2, khi mình ghi vào file rồi đọc và xuất ra màn hình thì xuất hiện thêm người thứ 3 với thông tin y hệt người thứ 2. Mình không rõ là sai ở chỗ nào nữa. Mọi người có thể xem giúp mình được không ạ?
    C++ Code:
    1. #include<iostream>
    2. #include<fstream>
    3.     using namespace std;
    4. struct sinhvien
    5. {
    6.     int MSSV;
    7.     char Hoten[30];
    8. };
    9. typedef struct sinhvien SINHVIEN;
    10. struct node
    11. {
    12.     SINHVIEN data;
    13.     struct node *pNext;
    14. };
    15. typedef struct node NODE;
    16. struct list
    17. {
    18.     NODE *pHead;
    19.     NODE *pTail;
    20. };
    21. typedef struct list LIST;
    22. NODE *Khoi_tao_node(SINHVIEN sv)
    23. {
    24.     NODE *p = new NODE;
    25.     if (p == NULL)
    26.     {
    27.         cout << "Khong du bo nho de cap phat.\n";
    28.         return NULL;
    29.     }
    30.     else
    31.     {
    32.         p->data = sv;
    33.         p->pNext = NULL;
    34.         return p;
    35.     }
    36. }
    37. void Khoi_tao_danh_sach(LIST &l)
    38. {
    39.     l.pHead = NULL;
    40.     l.pTail = NULL;
    41. }
    42. void Them_vao_dau_danh_sach(LIST &l, NODE *p)
    43. {
    44.     if (l.pHead == NULL)
    45.     {
    46.         l.pHead = l.pTail = p;
    47.     }
    48.     else
    49.     {
    50.         p->pNext = l.pHead;
    51.         l.pHead = p;
    52.     }
    53. }
    54. void Them_vao_cuoi_danh_sach(LIST &l, NODE *p)
    55. {
    56.     if (l.pHead == NULL)
    57.     {
    58.         l.pHead = l.pTail = p;
    59.     }
    60.     else
    61.     {
    62.         l.pTail->pNext = p;
    63.         l.pTail = p;
    64.     }
    65. }
    66. void Nhap_du_lieu(SINHVIEN &sv)
    67. {
    68.     cout << "MSSV: ";
    69.     cin >> sv.MSSV;
    70.     //cin.ignore();
    71.     cout << "Ho ten: ";
    72.     cin >> sv.Hoten;
    73. }
    74. void Xuat_du_lieu_1_sinh_vien(SINHVIEN sv)
    75. {
    76.     cout << "MSSV: " << sv.MSSV << endl;
    77.     cout << "Ho ten: " << sv.Hoten << endl;
    78. }
    79. void Xuat_danh_sach(LIST l)
    80. {
    81.     int dem = 1;
    82.     for (NODE *k = l.pHead; k != NULL; k = k->pNext)
    83.     {
    84.         cout << "\tSINH VIEN THU " << dem++ << endl;
    85.         Xuat_du_lieu_1_sinh_vien(k->data);
    86.         cout << endl;
    87.     }
    88. }
    89. int Reccount(LIST l)
    90. {
    91.     int dem = 0;
    92.     for (NODE *k = l.pHead; k != NULL; k = k->pNext)
    93.     {
    94.         dem++;
    95.     }
    96.     return dem;
    97. }
    98. void Them_sv_x_vao_sau_sv_thu_i(LIST &l)
    99. {
    100.     cout << "\nNhap du lieu sinh vien can them: " << endl;
    101.     SINHVIEN x;
    102.     Nhap_du_lieu(x);
    103.     NODE *p = Khoi_tao_node(x);
    104.     int i;
    105.     cout << "Nhap vi tri can them vao sau: ";
    106.     do
    107.     {
    108.         cin >> i;
    109.         if (i < 0)
    110.         {
    111.             cout << "Vi tri khong hop le. Xin nhap lai\n";
    112.             cout << "Nhap lai vi tri: ";
    113.         }
    114.     }while (i < 0);
    115.     if (i == 0)
    116.     {
    117.         Them_vao_dau_danh_sach(l,p);
    118.     }
    119.     else if (0 < i < Reccount(l))
    120.     {
    121.         int dem = 0;
    122.         for (NODE *k = l.pHead; k != NULL; k = k->pNext)
    123.         {
    124.             dem++;
    125.             if (dem == i)
    126.             {
    127.                 NODE *h = Khoi_tao_node(p->data);
    128.                 h->pNext = k->pNext;
    129.                 k->pNext = h;
    130.             }
    131.         }
    132.     }
    133.     else
    134.     {
    135.         Them_vao_cuoi_danh_sach(l,p);
    136.     }
    137. }
    138. void Tim_kiem_theo_MSSV(LIST l)
    139. {
    140.     int MS;
    141.     cout << "Nhap ma so sinh vien can tim kiem: ";
    142.     cin >> MS;
    143.     for (NODE *k = l.pHead; k != NULL; k = k->pNext)
    144.     {
    145.         if (k->data.MSSV == MS)
    146.         {
    147.             cout << "\tTHONG TIN SINH VIEN\n";
    148.             Xuat_du_lieu_1_sinh_vien(k->data);
    149.         }
    150.     }
    151. }
    152. void Sap_xep_theo_MSSV(LIST l)
    153. {
    154.     for (NODE *k = l.pHead; k->pNext != NULL; k = k->pNext)
    155.     {
    156.         for (NODE *g = k->pNext; g != NULL; g = g->pNext)
    157.         {
    158.             if(k->data.MSSV > g->data.MSSV)
    159.             {
    160.                 SINHVIEN t = k->data;
    161.                 k->data = g->data;
    162.                 g->data = t;
    163.             }
    164.         }
    165.     }
    166. }
    167. void Xoa_dau_danh_sach(LIST &l)
    168. {
    169.     if (l.pHead == NULL)
    170.     {
    171.         return;
    172.     }
    173.     else
    174.     {
    175.         NODE *p = l.pHead;
    176.         l.pHead = l.pHead->pNext;
    177.         delete p;
    178.     }
    179. }
    180. void Xoa_cuoi_danh_sach(LIST &l)
    181. {
    182.     if (l.pHead == NULL)
    183.     {
    184.         return;
    185.     }
    186.     else if (l.pHead == l.pTail)
    187.     {
    188.         Xoa_dau_danh_sach(l);
    189.     }
    190.     else
    191.     {
    192.         for (NODE *k = l.pHead; k != NULL; k = k->pNext)
    193.         {
    194.             if (k->pNext == l.pTail)
    195.             {
    196.                 delete l.pTail;
    197.                 k->pNext = NULL;
    198.                 l.pTail = k;
    199.                 return;
    200.             }
    201.         }
    202.     }
    203. }
    204. void Xoa_1_sinh_vien_theo_MSSV(LIST &l, int MS)
    205. {
    206.     if (l.pHead->data.MSSV == MS)
    207.     {
    208.         Xoa_dau_danh_sach(l);
    209.     }
    210.     if (l.pTail->data.MSSV == MS)
    211.     {
    212.         Xoa_cuoi_danh_sach(l);
    213.     }
    214.     NODE *g = new NODE;
    215.     for (NODE *k = l.pHead; k != NULL; k = k->pNext)
    216.     {
    217.         if (k->data.MSSV == MS)
    218.         {
    219.             g->pNext = k->pNext;
    220.             delete k;
    221.         }
    222.         g = k;
    223.     }
    224. }
    225. void Xoa_du_lieu(LIST &l)
    226. {
    227.     NODE *k = NULL;
    228.     while (l.pHead != NULL)
    229.     {
    230.         k = l.pHead;
    231.         l.pHead = l.pHead->pNext;
    232.         delete k;
    233.     }
    234. }
    235. bool IsEmpty(LIST l)
    236. {
    237.     if (l.pHead == NULL)
    238.     {
    239.         return true;
    240.     }
    241.     else
    242.     {
    243.         return false;
    244.     }
    245. }
    246. void Ghi_file(LIST l, ofstream &Fileout)
    247. {
    248.     for (NODE *k = l.pHead; k != NULL; k = k->pNext)
    249.     {
    250.         Fileout.write((char *)&(k->data), sizeof(k->data));
    251.     }  
    252. }
    253. void Doc_thong_tin_1_sv(SINHVIEN &x, ifstream &Filein)
    254. {
    255.     Filein.read((char *)(&x), sizeof(x));
    256. }
    257. void Doc_file(LIST &l, ifstream &Filein)
    258. {  
    259.     if (IsEmpty(l) == false)
    260.     {
    261.         Xoa_du_lieu(l);
    262.     }
    263.     while (Filein.eof() == false)
    264.     {
    265.         SINHVIEN x;
    266.         Doc_thong_tin_1_sv(x, Filein);
    267.         NODE *p = Khoi_tao_node(x);
    268.         Them_vao_cuoi_danh_sach(l,p);
    269.     }
    270. }
    271. void Menu(LIST &l)
    272. {
    273.     int luachon;
    274.     while(true)
    275.     {
    276.         system("cls");
    277.         cout << "\t\tQUAN LY SINH VIEN\n";
    278.         cout << "\t1.Nhap du lieu sinh vien.\n";
    279.         cout << "\t2.Xuat danh sach sinh vien.\n";
    280.         cout << "\t3.Them 1 sinh vien vao dau danh sach.\n";
    281.         cout << "\t4.Tong so sinh vien hien tai.\n";
    282.         cout << "\t5.Them 1 sinh vien vao sau sinh vien thu i.\n";
    283.         cout << "\t6.Tim kiem sinh vien theo ma so.\n";
    284.         cout << "\t7.Xoa sinh vien khoi danh sach.\n";
    285.         cout << "\t8.Sap xep sinh vien tang dan theo ma so.\n";
    286.         cout << "\t9.Ghi file.\n";
    287.         cout << "\t10.Doc file.\n";
    288.         cout << "\t0.Ket thuc.\n";
    289.         cout << "\t===========================\n";
    290.         cout << "Nhap lua chon: ";
    291.         do
    292.         {
    293.             cin >> luachon;
    294.             if (luachon < 0 || luachon > 10)
    295.             {
    296.                 cout << "Lua chon khong hop le. Xin nhap lai.\n";
    297.                 cout << "Nhap lai lua chon: ";
    298.             }
    299.         }while(luachon < 0 || luachon > 10);
    300.         if (luachon == 1)
    301.         {
    302.             cout << "\tNHAP THONG TIN SINH VIEN\n";
    303.             SINHVIEN x;
    304.             Nhap_du_lieu(x);
    305.             NODE *p = Khoi_tao_node(x);
    306.             Them_vao_cuoi_danh_sach(l,p);
    307.         }
    308.         else if (luachon == 2)
    309.         {
    310.             cout << "\t\tDANH SACH SINH VIEN\n";
    311.             Xuat_danh_sach(l);
    312.             system("pause");
    313.         }
    314.         else if (luachon == 3)
    315.         {
    316.             cout << "\tNHAP THONG TIN SINH VIEN CAN THEM\n";
    317.             SINHVIEN x;
    318.             Nhap_du_lieu(x);
    319.             NODE *p = Khoi_tao_node(x);
    320.             Them_vao_dau_danh_sach(l,p);
    321.         }
    322.         else if (luachon == 4)
    323.         {
    324.             cout << "Tong so sinh vien hien tai: " << Reccount(l);
    325.             cout << endl;
    326.             system("pause");
    327.         }
    328.         else if (luachon == 5)
    329.         {
    330.             Them_sv_x_vao_sau_sv_thu_i(l);
    331.         }
    332.         else if (luachon == 6)
    333.         {
    334.             Tim_kiem_theo_MSSV(l);
    335.             system("pause");
    336.         }
    337.         else if (luachon == 7)
    338.         {
    339.             int x;
    340.             cout << "Nhap ma so sinh vien can xoa: ";
    341.             cin >> x;
    342.             char t;
    343.             cout << "Ban that su muon xoa (Y/N)? ";
    344.             cin >> t;
    345.             if (t == 89 || t == 121)
    346.             {
    347.                 Xoa_1_sinh_vien_theo_MSSV(l,x);                
    348.             }
    349.         }
    350.         else if (luachon == 8)
    351.         {
    352.             Sap_xep_theo_MSSV(l);
    353.         }
    354.         else if (luachon == 9)
    355.         {
    356.             ofstream Fileout;
    357.             Fileout.open("D:\\CNTT\\C++\\CTDL&GT\\Chuong 4\\DSSV.dat", ios_base::out | ios_base::binary);
    358.             Ghi_file(l, Fileout);
    359.             Fileout.close();
    360.         }
    361.         else if (luachon == 10)
    362.         {
    363.             ifstream Filein;
    364.             Filein.open("D:\\CNTT\\C++\\CTDL&GT\\Chuong 4\\DSSV.dat", ios_base::in | ios_base::binary);
    365.             if (Filein.fail() == true)
    366.             {
    367.                 cout << "File khong ton tai.\n";
    368.                 system("pause");
    369.             }
    370.             else
    371.             {
    372.                 Doc_file(l, Filein);   
    373.             }
    374.             Filein.close();
    375.         }
    376.         else
    377.         {
    378.             break;
    379.         }
    380.     }
    381. }
    382.  
    383. int main()
    384. {
    385.     LIST l;
    386.     Khoi_tao_danh_sach(l);
    387.     Menu(l);
    388.     system("pause");
    389.     return 0;
    390. }
    Đã được chỉnh sửa lần cuối bởi section0000 : 14-04-2020 lúc 07:09 PM.

  2. #2
    Ngày gia nhập
    12 2015
    Nơi ở
    Đà Nẵng
    Bài viết
    662

    Biên dịch không báo lỗi gì à
    Dòng 119 lạ quá!

    - - - Nội dung đã được cập nhật ngày 15-04-2020 lúc 03:10 PM - - -

    Thế sau khi bạn thêm vài sinh viên rồi hiển thị danh sách(lúc chưa ghi ra file), kết quả có thừa không?

  3. #3
    Ngày gia nhập
    04 2020
    Bài viết
    6

    Trích dẫn Nguyên bản được gửi bởi khoaph Xem bài viết
    Biên dịch không báo lỗi gì à
    Dòng 119 lạ quá!

    - - - Nội dung đã được cập nhật ngày 15-04-2020 lúc 03:10 PM - - -

    Thế sau khi bạn thêm vài sinh viên rồi hiển thị danh sách(lúc chưa ghi ra file), kết quả có thừa không?
    Không bạn. Lúc chưa ghi vào file thì vẫn hiển thị đúng. Chỉ có khi ghi vào rồi đọc và xuất ra màn hình thì mới xuất hiện thêm 1 người nữa.
    Dòng 119 là thêm 1 phần tử vào sau phần tử có vị trí thứ i trong danh sách
    Đã được chỉnh sửa lần cuối bởi section0000 : 15-04-2020 lúc 03:46 PM.

  4. #4
    Ngày gia nhập
    12 2015
    Nơi ở
    Đà Nẵng
    Bài viết
    662

    Code:
    //dòng 119
    else if (0 < i < Reccount(l))
    //dòng trên vẫn chạy bình thường à, ở máy mình c trình không chạy
    Mình nghĩ lỗi là ở eof()
    C++ Code:
    1. #include <iostream>
    2. #include <fstream>
    3. using namespace std;
    4. int main(int argc, char *argv[])
    5. {
    6.     ofstream ofs;
    7.     ofs.open("data.dat",ios_base::out|ios_base::binary);
    8.     char ch='a';
    9.     for(int i=0;i<10;i++,ch++)
    10.     {
    11.         ofs.write(&ch,sizeof(ch));
    12.     }
    13.     ofs.close();
    14.     ifstream ifs;
    15.     ifs.open("data.dat",ios_base::in|ios_base::binary);
    16.     while(!ifs.eof())
    17.     {
    18.         ifs.read(&ch,sizeof(ch));
    19.         cout<<ch;  
    20.     }
    21.     ifs.close();
    22.     cout<<endl;
    23.     ifs.open("data.dat",ios_base::in|ios_base::binary);
    24.     while(ifs>>ch)
    25.     {
    26.         cout<<ch;  
    27.     }
    28.     ifs.close();
    29. }
    30. /*kết quả là
    31. abcdefghijj
    32. abcdefghij
    33. [Program finished]
    34. */

    - - - Nội dung đã được cập nhật ngày 15-04-2020 lúc 04:21 PM - - -


    Why does ifstream.eof() not return TRUE after reading the last line of a file? - Software Engineering Stack Exchange

  5. #5
    Ngày gia nhập
    04 2020
    Bài viết
    6

    Trích dẫn Nguyên bản được gửi bởi khoaph Xem bài viết
    Code:
    //dòng 119
    else if (0 < i < Reccount(l))
    //dòng trên vẫn chạy bình thường à, ở máy mình c trình không chạy
    Mình nghĩ lỗi là ở eof()
    C++ Code:
    1. #include <iostream>
    2. #include <fstream>
    3. using namespace std;
    4. int main(int argc, char *argv[])
    5. {
    6.     ofstream ofs;
    7.     ofs.open("data.dat",ios_base::out|ios_base::binary);
    8.     char ch='a';
    9.     for(int i=0;i<10;i++,ch++)
    10.     {
    11.         ofs.write(&ch,sizeof(ch));
    12.     }
    13.     ofs.close();
    14.     ifstream ifs;
    15.     ifs.open("data.dat",ios_base::in|ios_base::binary);
    16.     while(!ifs.eof())
    17.     {
    18.         ifs.read(&ch,sizeof(ch));
    19.         cout<<ch;  
    20.     }
    21.     ifs.close();
    22.     cout<<endl;
    23.     ifs.open("data.dat",ios_base::in|ios_base::binary);
    24.     while(ifs>>ch)
    25.     {
    26.         cout<<ch;  
    27.     }
    28.     ifs.close();
    29. }
    30. /*kết quả là
    31. abcdefghijj
    32. abcdefghij
    33. [Program finished]
    34. */

    - - - Nội dung đã được cập nhật ngày 15-04-2020 lúc 04:21 PM - - -


    Why does ifstream.eof() not return TRUE after reading the last line of a file? - Software Engineering Stack Exchange
    Mình fix được rồi. Cảm ơn bạn.

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