c++写入读取二进制(写入乱码 读取不乱码)

cpp 复制代码
#include <iostream>
#include <fstream>
#include <vector>
#include <string>

struct Student {
    std::string name;
    int studentID;
    int age;
};
using namespace std;

void writeStudentsToFile(const std::vector<Student>& students) {
    std::ofstream outputFile("students.dat", std::ios::binary);

    if (outputFile.is_open()) {
        // 写入学生数量
        int numStudents = students.size();
        outputFile.write(reinterpret_cast<const char*>(&numStudents), sizeof(numStudents));

        // 逐个写入学生信息
        for (const Student& student : students) {
            int nameSize = student.name.size();
            outputFile.write(reinterpret_cast<const char*>(&nameSize), sizeof(nameSize));
            outputFile.write(student.name.c_str(), nameSize);

            outputFile.write(reinterpret_cast<const char*>(&student.studentID), sizeof(student.studentID));
            outputFile.write(reinterpret_cast<const char*>(&student.age), sizeof(student.age));
        }

        outputFile.close();
        std::cout << "学生信息已成功保存到文件。" << std::endl;
    } else {
        std::cout << "无法打开文件。" << std::endl;
    }
}

void readStudentsFromFile(std::vector<Student>& students) {
    std::ifstream inputFile("students.dat", std::ios::binary);

    if (inputFile.is_open()) {
        // 读取学生数量
        int numStudents;
        inputFile.read(reinterpret_cast<char*>(&numStudents), sizeof(numStudents));

        // 逐个读取学生信息
        for (int i = 0; i < numStudents; ++i) {
            int nameSize;
            inputFile.read(reinterpret_cast<char*>(&nameSize), sizeof(nameSize));
            std::string name(nameSize, ' ');
            inputFile.read(&name[0], nameSize);

            int studentID;
            inputFile.read(reinterpret_cast<char*>(&studentID), sizeof(studentID));

            int age;
            inputFile.read(reinterpret_cast<char*>(&age), sizeof(age));

            students.push_back({name, studentID, age});
        }

        inputFile.close();
        std::cout << "学生信息已成功从文件读取。" << std::endl;
    } else {
        std::cout << "无法打开文件。" << std::endl;
    }
}

int main() {
    int choice;
    std::cout << "请输入选项:1 - 写入学生信息到文件;2 - 从文件读取学生信息" << std::endl;
    std::cin >> choice;
    vector<Student>  students;
    if(choice==1){
        students.push_back({"张三", 1001, 20});
        students.push_back({"李四", 1002, 21});
        students.push_back({"爱达斯", 1003, 22});
        writeStudentsToFile(students);
    } else if (choice == 2) {
        readStudentsFromFile(students);
        // 打印读取的学生信息
        for (const Student& student : students) {
            std::cout << "姓名:" << student.name << std::endl;
            std::cout << "学号:" << student.studentID << std::endl;
            std::cout << "年龄:" << student.age << std::endl;
            std::cout << std::endl;
        }
    } else {
        std::cout << "无效的选项。" << std::endl;
    }

    return 0;
}
相关推荐
饕餮争锋16 分钟前
org.slf4j.MDC介绍-笔记
java·开发语言·笔记
半部论语20 分钟前
jdk多版本切换,通过 maven 指定编译jdk版本不生效,解决思路
java·开发语言·maven·intellij-idea
阿沁QWQ21 分钟前
单例模式的两种设计
开发语言·c++·单例模式
六bring个六29 分钟前
qtcreater配置opencv
c++·qt·opencv·计算机视觉·图形渲染·opengl
Python ml30 分钟前
Tomcat与纯 Java Socket 实现远程通信的区别
java·开发语言·tomcat
qwertyuiop_i34 分钟前
pe文件二进制解析(用c/c++解析一个二进制pe文件)
c语言·c++·pe文件
说码解字35 分钟前
ExoPlayer 如何实现音画同步
开发语言·学习·音视频
冼紫菜43 分钟前
如何在 CentOS 7 虚拟机上配置静态 IP 地址并保持重启后 SSH 连接
linux·开发语言·centos·ssh
陈奕昆1 小时前
五、【LLaMA-Factory实战】模型部署与监控:从实验室到生产的全链路实践
开发语言·人工智能·python·llama·大模型微调
明月看潮生1 小时前
青少年编程与数学 02-019 Rust 编程基础 10课题、函数、闭包和迭代器
开发语言·青少年编程·rust·编程与数学