m0_59716586 2024-06-20 08:31 采纳率: 0%
浏览 2
已结题

运行错误太多了,如何解决


#include <fstream>
#include <iostream>
#include <string>
using namespace std;
class Date {
public:
    // 构造函数,接受年、月、日的参数
    Date(int year=0, int month=0, int day=0) : year(year), month(month), day(day) {}
    int getYear() const { return year; }
    int getMonth() const { return month; }
    int getDay() const { return day; }
private:
    int year;
    int month;
    int day;
};
class Person {
public:
    // 构造函数,接受编号、姓名、性别、生日和基本工资的参数
    Person(){
}
    Person(int id, string name, char sex, Date birth, int baseSalary) 
        : id(id), name(name), sex(sex), birth(birth), baseSalary(baseSalary) {}
    int getId() const { return id; }
    string getName() const { return name; }
    char getSex() const { return sex; }
    Date getBirth() const { return birth; }
    int getBaseSalary() const { return baseSalary; }
    friend ostream& operator << (ostream& os, Person& person){
os<<person.id<<" "<<person.name<<" "<<person.sex<<" "<<person.birth.getYear()<<" "<<person.birth.getMonth()<<" "<<person.birth.getDay()<<" "<<person.baseSalary;
return os;
}
private:
    int id;
    string name;
    char sex;
    Date birth;
    int baseSalary;
};
int main() {
    fstream file("data.bin", ios::in | ios::out | ios::binary);
    if (!file.is_open()) {
        cerr << "无法打开文件" << endl;
        return 1;
    }
    // 写入研究生信息
    Person graduate=Person(1, "LiPing", 'm', Date(2002, 12, 3), 4000);
    file.seekp(0, ios::end);
    file.write(reinterpret_cast<const char *>(&graduate), sizeof(graduate));
    // 读取研究生信息
    Person person;
    file.seekg(0, ios::beg);
    file.read(reinterpret_cast<char *>(&person), sizeof(person));
    cout << person << endl;
    file.close();
    return 0;
}


  • 写回答

2条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-20 08:31
    关注

    引自免费微信小程序:皆我百晓生

    从你给出的代码来看,这是一个关于使用C++的文件操作的问题。对于你的运行错误问题,我注意到以下几点可能的问题和解决方案:

    1. 文件操作错误处理不足:在文件打开失败时没有进行足够的错误处理。虽然你已经检查了文件是否打开成功,但在其他文件操作(如写入和读取)中也需要进行错误检查。当写入或读取失败时,程序应该进行错误处理而不是继续执行。
    2. 数据序列化问题:你试图直接将一个对象写入文件然后再从文件中读取出来。这在C++中可能会导致问题,因为对象的内存布局(包括成员变量的内存顺序)可能因编译器或平台的不同而不同。你需要确保以固定的顺序序列化对象的成员变量,并从文件中读取它们。

    针对上述问题,以下是修改后的代码示例:

    #include <fstream>
    #include <iostream>
    #include <string>
    using namespace std;
    
    // ...(与之前的代码相同)...
    
    int main() {
        fstream file("data.bin", ios::in | ios::out | ios::binary);
        if (!file.is_open()) {
            cerr << "无法打开文件" << endl;
            return 1;
        }
        // 确保文件的操作也有错误处理
        bool writeSuccess = false;
        // 写入研究生信息
        Person graduate = Person(1, "LiPing", 'm', Date(2002, 12, 3), 4000);
        if (file.write(reinterpret_cast<const char *>(&graduate), sizeof(graduate))) {
            writeSuccess = true; // 写入成功标记为true
        } else {
            cerr << "写入文件失败!" << endl; // 输出错误信息并退出程序或采取其他操作
            file.close(); // 虽然操作失败,但仍然关闭文件流以避免后续问题
            return 1; // 返回错误码或采取其他操作
        }
        file.seekg(0, ios::beg); // 重新定位到文件开头以读取数据(这一步可以在写入之后立即完成)
        Person person; // 用于存储从文件中读取的数据的对象实例
        if (!file.read(reinterpret_cast<char *>(&person), sizeof(person))) { // 检查读取是否成功
            cerr << "读取文件失败!" << endl; // 输出错误信息并退出程序或采取其他操作
            return 1; // 返回错误码或采取其他操作
        } else { // 如果读取成功,输出读取到的数据并结束程序或采取其他操作
            cout << person << endl; // 输出读取到的数据对象实例的信息(这里假设重载了<<运算符)
            file.close(); // 关闭文件流以释放资源或其他相关操作(如果还有其他操作的话)
            return 0; // 返回成功码或其他相关操作结果(如果还有其他操作的话)
        }
    }
    

    注意:这个代码示例假设你已经重载了 operator<< 用于输出 Person 类实例的信息到控制台或其他地方。这是你在 Person 类中已经完成的部分工作。在实际应用中,你可能还需要处理更多的错误情况和细节问题。

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 6月20日
  • 修改了问题 6月20日
  • 创建了问题 6月20日

悬赏问题

  • ¥15 python怎么在已有视频文件后添加新帧
  • ¥20 虚幻UE引擎如何让多个同一个蓝图的NPC执行一样的动画,
  • ¥15 fluent里模拟降膜反应的UDF编写
  • ¥15 MYSQL 多表拼接link
  • ¥15 关于某款2.13寸墨水屏的问题
  • ¥15 obsidian的中文层级自动编号
  • ¥15 同一个网口一个电脑连接有网,另一个电脑连接没网
  • ¥15 神经网络模型一直不能上GPU
  • ¥15 pyqt怎么把滑块和输入框相互绑定,求解决!
  • ¥20 wpf datagrid单元闪烁效果失灵