0 👍
76 lượt xem
bởi (🏅0)
Mình đang thực hành lập trình 1 phần mềm quản lí dữ liệu ô tô. Bài của mình bao gồm:
- 1 lớp Display lưu 3 thông tin số.
- 1 lớp Sound lưu 4 thông tin số.
- 1 lớp CommonInfo lưu các thông tin cá nhân bao gồm: tên, email, keyNumber (string), số km đã đi, số km cần bảo dưỡng định kì (int).
-1 lớp CarInfomation kế thừa lớp CommonInfo bao gồm: con trỏ kiểu Sound, con trỏ kiểu Display.
Sau khi nhập dữ liệu, hiển thị thông tin nhân vật lên console đã khá ổn rồi nhưng mình muốn ghi vào file. Mình cũng vừa học được cách ghi cả đối tượng bằng dòng lệnh: out_File.write(reinterpret_cast<char*> (&carInfo), sizeof(CarInfomation)); nên chưa hiểu lắm nhưng file text của em nó hiển thi ra toàn những kí tự la mã cổ đại hay gì ấy. Dưới là code file .cpp và txt của mình, đoạn ghi code mình code ở void writeFile và xử lí thêm 1 chút ở dưới cùng mong mng giúp đỡ:

File.cpp
#include<windows.h>
#include<fstream>
#include<vector>
#include"CarInfomation.h"
CarInfomation** carList = new CarInfomation*[100];
void mainMenu() {
    cout << "------SELECT MENU------";
    cout << "\n1. Input setting infomation.";
    cout << "\n2. Print setting infomation.";
    cout << "\n3. Exit";
    cout << "\nYour selection: ";
}
void settingMenu() {
    cout << "------SELECT MENU------";
    cout << "\n1. Display setting.";
    cout << "\n2. Sound setting.";
    cout << "\n3. Exit";
    cout << "\nYour selection: ";
}
void printMenu() {
    cout << "------SELECT MENU------";
    cout << "\n1. Print display setting infomation.";
    cout << "\n2. Print sound setting infomation.";
    cout << "\n3. Print all setting infomation.";
    cout << "\n4. Exit.";
    cout << "\nYour selection: ";
}

void nhapThongTinDisplay(int &carCnt) {
    char answer = 'n';
    CarInfomation* carInfo = new CarInfomation();
    system("cls");
    cout << "\nCar Index: " << carCnt + 1;
    carInfo->nhapThongTin();
    if (carCnt > 0) {
        int viTri = -1;
        for (int i = 0; i < carCnt; i++) {
            if (carInfo->getKeyNumber() == carList[i]->getKeyNumber()) {
                viTri = i;
                break;
            }
        }
        if (viTri != -1) {
            cout << "\t->This is already existed, data will be overriten." << endl;
            carInfo->getDisplay()->nhapThongTin();
            carInfo->getSound()->setMedia(carList[viTri]->getSound()->getMedia());
            carInfo->getSound()->setCall(carList[viTri]->getSound()->getCall());
            carInfo->getSound()->setNavigation(carList[viTri]->getSound()->getNavigation());
            carInfo->getSound()->setNotification(carList[viTri]->getSound()->getNotification());
            carList[viTri] = carInfo;
        }
        else {
            cout << "\t->This is car, data will be appended to list." << endl;
            carInfo->getDisplay()->nhapThongTin();
            carInfo->getSound();
            carList[carCnt] = carInfo;
            carCnt++;
        }
    }
    else {
        cout << "\t->This is car, data will be appended to list." << endl;
        carInfo->getDisplay()->nhapThongTin();
        carInfo->getSound();
        carList[carCnt] = carInfo;
        carCnt++;
    }
}
void nhapThongTinSound(int& carCnt) {
    char answer = 'n';
    CarInfomation* carInfo = new CarInfomation();
    system("cls");
    cout << "\nCar Index: " << carCnt + 1;
    carInfo->nhapThongTin();
    if (carCnt > 0) {
        int viTri = -1;
        for (int i = 0; i < carCnt; i++) {
            if (carInfo->getKeyNumber() == carList[i]->getKeyNumber()) {
                viTri = i;
                break;
            }
        }
        if (viTri != -1) {
            cout << "\t->This is already existed, data will be overriten." << endl;
            carInfo->getSound()->nhapThongTin();
            carInfo->getDisplay()->setLightLevel(carList[viTri]->getDisplay()->getLightLevel());
            carInfo->getDisplay()->setScreenLightLevel(carList[viTri]->getDisplay()->getScreenLightLevel());
            carInfo->getDisplay()->setTaploLightLevel(carList[viTri]->getDisplay()->getTaploLightLevel());
            carList[viTri] = carInfo;
        }
        else {
            cout << "\t->This is car, data will be appended to list." << endl;
            carInfo->getSound()->nhapThongTin();
            carInfo->getDisplay();
            carList[carCnt] = carInfo;
            carCnt++;
        }
    }
    else {
        cout << "\t->This is car, data will be appended to list." << endl;
        carInfo->getSound()->nhapThongTin();
        carInfo->getDisplay();
        carList[carCnt] = carInfo;
        carCnt++;
    }
}
void xuatThongTinDisplay(int& carCnt) {
    if(carCnt == 0){
        cout << "There is no cars in the list.";
    }
    else {
        cout << left << setw(20) << "Ower name" << left << setw(40) << "Ower email" << left << setw(20) << "Key number" << left << setw(20) << "ODO Number" << left << setw(20) << "Remind Service" << left << setw(15) << "Light level" << left << setw(25) << "Screen light level" << left << setw(25) << "Taplo light level" << endl;
        for (size_t i = 0; i < carCnt; i++) {
            carList[i]->xuatThongTin();
            carList[i]->getDisplay()->xuatThongTin();
            cout << endl;
        }
    }
}
void xuatThongTinSound(int& carCnt) {
    if (carCnt == 0) {
        cout << "There is no cars in the list.";
    }
    else {
        cout << left << setw(20) << "Ower name" << left << setw(40) << "Ower email" << left << setw(20) << "Key number" << left << setw(20) << "ODO Number" << left << setw(20) << "Remind Service" << left << setw(10) << "Media" << left << setw(10) << "Call" << left << setw(15) << "Navigation" << left << setw(15) << "Notification" << endl;
        for (size_t i = 0; i < carCnt; i++) {
            carList[i]->xuatThongTin();
            carList[i]->getSound()->xuatThongTin();
            cout << endl;
        }
    }
}
void xuatThongTinTat(int& carCnt) {
    if (carCnt == 0) {
        cout << "There is no cars in the list.";
    }
    else {
        cout << left << setw(20) << "Ower name" << left << setw(40) << "Ower email" << left << setw(20) << "Key number" << left << setw(20) << "ODO Number" << left << setw(20) << "Remind Service" << left << setw(15) << "Light level" << left << setw(25) << "Screen light level" << left << setw(25) << "Taplo light level" << left << setw(10) << "Media" << left << setw(10) << "Call" << left << setw(15) << "Navigation" << left << setw(15) << "Notification" << endl;
        for (size_t i = 0; i < carCnt; i++) {
            carList[i]->xuatThongTin();
            carList[i]->getDisplay()->xuatThongTin();
            carList[i]->getSound()->xuatThongTin();
            cout << endl;
        }
    }
}
void writeFile(CarInfomation* carInfo, string fileName) {
    ofstream out_File;
    out_File.open(fileName, ios_base::out | ios_base::app);
    if (out_File.fail()) {
        return;
    }
    out_File.write(reinterpret_cast<char*> (&carInfo), sizeof(CarInfomation));
    out_File.close();

}
int main() {
    int carCnt = 0;
    while (true) {
        system("cls");
        int select;
        mainMenu();
        cin >> select;
        if (select == 1) {
            while (true) {
                system("cls");
                int select1;
                settingMenu();
                cin >> select1;
                if (select1 == 1) {
                    system("cls");
                    char answer = 'n';
                    cout << "\nWill you input for car " << carCnt + 1  << " (y/n): ";
                    cin >> answer;
                    do {
                        system("cls");
                        cout << "---Input Display setting---";
                        nhapThongTinDisplay(carCnt);
                        cout << "\nWill you input for car " << carCnt + 1 << " (y/n): ";
                        cin >> answer;
                    } while (answer == 'y');
                }
                else if (select1 == 2) {
                    system("cls");
                    char answer = 'n';
                    cout << "\nWill you input for car " << carCnt + 1 << " (y/n): ";
                    cin >> answer;
                    do {
                        system("cls");
                        cout << "---Input Sound setting---";
                        nhapThongTinSound(carCnt);
                        cout << "\nWill you input for car " << carCnt + 1 << " (y/n): ";
                        cin >> answer;
                    } while (answer == 'y');
                }
                else if (select1 == 3) {
                    break;
                }
                else {
                    cout << "Your selection is not exits.";
                    Sleep(1000);
                    system("cls");
                }
            }
        }
        else if (select == 2) {
            while (true) {
                system("cls");
                int select1;
                printMenu();
                cin >> select1;
                if (select1 == 1) {
                    char answer = 'a';
                    do {
                        system("cls");
                        xuatThongTinDisplay(carCnt);
                        cout << endl << "Press e to exit.";
                        cin >> answer;
                    } while (answer == 'a');
                }
                else if (select1 == 2){
                    char answer = 'a';
                    do {
                        system("cls");
                        xuatThongTinSound(carCnt);
                        cout << endl << "Press \"e\" to exit.";
                        cin >> answer;
                    } while (answer == 'a');
                }
                else if (select1 == 3) {
                    char answer = 'a';
                    do {
                        system("cls");
                        xuatThongTinTat(carCnt);
                        cout << endl << "Press \"e\" to exit.";
                        cin >> answer;
                    } while (answer == 'a');
                }
                else if (select1 == 4) {
                    break;
                }
                else {
                    cout << "Your selection is not exits.";
                    Sleep(1000);
                    system("cls");
                }
            }

        }
        else if (select == 3) {
            system("cls");
            cout << "\n\tGOOD BYE";
            Sleep(3000);
            break;
        }
        else {
            cout << "\nYour selection is not exist.";
            Sleep(1000);
            system("cls");
        }
    }
    for (int i = 0; i < carCnt; i++) {
        writeFile(carList[i], "CarInfomation.txt");
    }
    system("pause");
    return 0;
}

File.txt:
xŸ POàE¸       ø¹       xÐÒ xÐÒ  Ðî F½Yzœö¹            \   èò ~I  üö¹ ºäYz             Sv ÐAv ÌÌÌÌÌÌÌÌÌÌÌÌ      (Rv  Dv ÌÌÌÌÌÌÌÌÌÌÌÌ      Pv 08552366              '  Ð   u ¬œu

1 Câu trả lời

0 👍
bởi (🏅167)

Cách làm của e bị sai rồi.

1. Class CarInfomation của em là một kiểu dữ liệu phức tạp , nó chứa cả string, int chứ phải đơn giản chỉ là 1 chuỗi ký tự nên khi write object của nó em ko thể write text đc mà phải write binary. Để write binary thì khi open file phải truyền tham số như này:

out_File.open(fileName, ios_base::out | ios_base::app | ios_base::binary);
2. Vì object của em chứa cả pointer , mà pointer chỉ valid trong 1 lần chạy của chương trình nên khi lần sau e read lên và truy cập vào vùng nhớ trỏ bởi pointer đó có thể bị lỗi access memory ==> để giải quyết vđ này thì object ko đc chứa pointer
bởi

-Em chuyển hướng ghi vào file từng thuộc tính của lớp CarInfomation bằng hàm get.
-Sau đó khi mới khởi động chương trình em lấy dữ liệu từ file nạp vào mảng bằng hàm set. Tuy nhiên em gặp lỗi LNK 2019:

Code: 

Lỗi: Error LNK2019 unresolved external symbol "public: void __thiscall CommonInfomation::setKeyNumber(class std::basic_string,class std::allocator >)" (?setKeyNumber@CommonInfomation@@QAEXV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) referenced in function "void __cdecl readFile(class CarInfomation * *,class std::basic_string,class std::allocator >,int)" (?readFile@@YAXPAPAVCarInfomation@@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@H@Z) GiaoDienOto D:\study\C++\GiaoDienOto\GiaoDienOto\Main.obj 1

Coding Guru là nơi dành cho cộng đồng lập trình viên Việt Nam hỗ trợ nhau về tất cả các vấn đề liên quan đến công nghệ.

Chúng ta hãy cùng nhau xây dựng một cộng đồng công nghệ Việt Nam mạnh mẽ, thúc đẩy và giúp đỡ nhau cùng phát triển, thăng tiến trong sự nghiệp.

***
Nơi đam mê hội tụ
***

Một số câu hỏi gần đây có thể tương tự hoặc liên quan ↓

...