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

Đề tài: Bị lỗi Debug Assertion failed nếu nhập quá 15 kí tự khi sử dụng thành phần kiểu string trong struct

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

    Post Bị lỗi Debug Assertion failed nếu nhập quá 15 kí tự khi sử dụng thành phần kiểu string trong struct

    Mình làm 1 bài tập đọc 1 struct từ file nhị phân rồi xuất ra file văn bản. Nhưng khi nhập thành phần kiểu string (tên sách, tên tác giả) mà quá 15 kí tự thì bị lỗi Debug assertion failed

    Click vào hình ảnh để lấy hình ảnh lớn

Tên:		loi.JPG
Lần xem:	5
Size:		26.3 KB
ID:		8807


    nếu nhập không quá 15 kí tự thì không bị lỗi

    Đây là input bị lỗi:

    Click vào hình ảnh để lấy hình ảnh lớn

Tên:		input.JPG
Lần xem:	34
Size:		4.9 KB
ID:		8808

    Mình đã thử sau khi ghi xuống file nhị phân và đọc ra màn hình để xem nội dung file thì nó ntn

    Click vào hình ảnh để lấy hình ảnh lớn

Tên:		out.JPG
Lần xem:	34
Size:		6.1 KB
ID:		8809

    Nhập ít hơn 16 kí tự thì vẫn in ra đầy đủ
    Đây là code của mình (code này là đọc và ghi ra file):
    C++ Code:
    1. #include <iostream>
    2. #include <fstream>
    3. #include "Ham.h"
    4. #include <string>
    5. using namespace std;
    6.  
    7. int taoinput(char* fname, SACH bk)
    8. {
    9.     ofstream iFile;
    10.     iFile.open(fname,ios::binary);
    11.     if(iFile.good() == false)
    12.         return 0;
    13.  
    14.     cout<<"Nhap thong tin sach\n";
    15.     cout<<"Ma sach: ";          cin>>bk.mso;    cin.get();
    16.     cout<<"Ten sach: ";         getline(cin,bk.ten);
    17.     cout<<"Ten tac gia: ";      getline(cin,bk.tentg);
    18.     cout<<"Thang xuat ban: ";   cin>>bk.thangxb;
    19.     cout<<"Nam xuat ban: ";     cin>>bk.namxb;
    20.     cout<<"Gia tien: ";         cin>>bk.gia;
    21.  
    22.     iFile.write((char*)&bk,sizeof(bk));
    23.     iFile.close();
    24.     return 1;
    25. }
    26.  
    27. int xuatravb(char* finp, char* fout)    //doc du lieu tu file nhi phan finp
    28. {                                       //roi ghi ra file van ban fout
    29.     SACH bk;
    30.     ifstream iFile;
    31.     ofstream oFile;
    32.     iFile.open(finp,ios::in | ios::binary); //mo file de doc du lieu tu no
    33.     oFile.open(fout,ios::out);      //mo file nay de ghi du lieu ra
    34.  
    35.     if( (iFile.good() == 0) || (oFile.good() == 0))
    36.         return 0;
    37.  
    38.     iFile.read((char*)&bk,sizeof(bk));
    39.     oFile<<bk.mso<<endl;
    40.     //==================viet hoa ten sach======================
    41.     for(int i=0; i<(int)bk.ten.size(); i++)
    42.         bk.ten[i] = toupper(bk.ten[i]);
    43.     oFile<<bk.ten<<endl;
    44.     //==================viet hoa chu dau ten tac gia===========
    45.     for(int i=0, flag = 1; i<(int)bk.tentg.size(); i++)
    46.     {
    47.         if(bk.tentg[i] != ' ' && flag == 1)
    48.         {
    49.             bk.tentg[i] = toupper(bk.tentg[i]);
    50.             flag = 0;
    51.         }
    52.         else if(bk.tentg[i] == ' ')
    53.             flag=1;
    54.     }
    55.     oFile<<bk.tentg<<endl;
    56.     //=========================================================
    57.  
    58.     oFile<<bk.thangxb<<endl;
    59.     oFile<<bk.namxb<<endl;
    60.     oFile<<bk.gia;
    61.     iFile.close();
    62.     oFile.close();
    63.     return 1;
    64. }

    Đây là Struct mình khai báo trong file .h:

    C++ Code:
    1. #ifndef _baitap
    2. #define _baitap
    3.  
    4. #include <iostream>
    5. #include <string>
    6.  
    7. struct SACH
    8. {
    9.     int mso;
    10.     std::string ten;
    11.     std::string tentg;
    12.     int thangxb;
    13.     int namxb;
    14.     double gia;
    15. };
    16. int taoinput(char*, SACH);      //tao file input de test
    17. int xuatravb(char*, char*);     //lay du lieu tu file de xu ly
    18. #endif

    Hàm main thì gọi như vầy:
    C++ Code:
    1. #include <iostream>
    2. #include "Ham.h"
    3. using namespace std;
    4.  
    5. int main()
    6. {
    7.     SACH book;
    8.     taoinput("test.bin",book);
    9.     xuatravb("test.bin","output.bin");
    10.     return 1;
    11. }

    Xin mọi người giúp đỡ mình cách khắc phục, xin cảm ơn!!

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

    Hình gì bé tí thế kia @@

    Cái 2 chỗ đọc và ghi này sao lại char*

    iFile.read((char*)&bk,sizeof(bk));
    iFile.write((char*)&bk,sizeof(bk));

    SACH* chứ

    Sửa lại coi chạy đúng không?
    Đã được chỉnh sửa lần cuối bởi clchicken : 14-03-2012 lúc 10:44 AM.
    Um Mani Padme Hum...!!

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

    Hình thì mình attach vào thôi, bấm vào cũng hiện to lên mà, để về nhà sửa lại cho lớn thêm, đang ở trường máy k vào photobucket dc

    mình đã sữa như bạn nói rồi nhưng báo lỗi

    Error 1 error C2664: 'std::basic_ostream<_Elem,_Traits>::write' : cannot convert parameter 1 from 'SACH *' to 'const char *' d:\bin\bin\bai06\ham.cpp 23
    Error 2 error C2664: 'std::basic_istream<_Elem,_Traits>::read' : cannot convert parameter 1 from 'SACH *' to 'char *' d:\bin\bin\bai06\ham.cpp 38

    cái tham số này phải là địa chỉ của 1 kí tự hoặc là con trỏ tới kiểu char mà bạn
    Đã được chỉnh sửa lần cuối bởi 5fox : 14-03-2012 lúc 11:10 AM.

  4. #4
    Ngày gia nhập
    03 2010
    Nơi ở
    My Home
    Bài viết
    772

    std::string chỉ là một mảng động các ký tự. Bạn write vào file theo kiểu write(&bk, sizeof(bk)) thì chỉ write cái địa chỉ con trỏ của biến 2 biến std::string đó chứ không write cái nội dung vùng nhớ con trỏ trỏ tới.
    Trong cùng một chương trình nếu vùng nhớ đó chưa bị hủy thì nó còn trỏ chính xác. Chứ chương trình khác thì chết luôn.

    Bạn nên khai báo kiểu

    Code:
    char ten[50];
    char tentg[30];
    thì sẽ write file được kiểu đó. Nếu không bạn sẽ phải tách từng biến ra mà write vào file

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

    Ặc, xin lỗi mình nhầm
    Um Mani Padme Hum...!!

  6. #6
    Ngày gia nhập
    11 2011
    Bài viết
    32

    Mặc định Bị lỗi Debug Assertion failed nếu nhập quá 15 kí tự khi sử dụng thành phần kiểu string trong struct

    @namdq2k: cám ơn bạn, mình sẽ thử

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

  1. Bài tập C Lỗi DEBUG ASSERTION FAILED khi cấp phát động
    Gửi bởi oracle95 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 8
    Bài viết cuối: 04-01-2014, 04:07 PM
  2. Tìm đường đi của matrix, báo lỗi debug assertion failed?
    Gửi bởi nguyendinhhao trong diễn đàn Thảo luận, góp ý code C/C++ của bạn
    Trả lời: 0
    Bài viết cuối: 19-05-2013, 09:57 AM
  3. xảy ra lỗi debug assertion failed khi push_back con trỏ đối tượng vào vector?
    Gửi bởi pe_bi19 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: 23-04-2012, 06:10 PM
  4. Lỗi: debug assertion failed xử lý thế nào?
    Gửi bởi Athrun trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 1
    Bài viết cuối: 14-12-2011, 06:04 PM
  5. Lỗi DEBUG ASSERTION FAILED! trong VS 2005 sửa thế nào?
    Gửi bởi thanhtt trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 4
    Bài viết cuối: 03-08-2011, 06:44 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