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;
}
相关推荐
Mr_WangAndy3 分钟前
C++设计模式_结构型模式_外观模式Facade
c++·设计模式·外观模式
FreeBuf_10 分钟前
Happy DOM曝CVSS 9.4严重RCE漏洞,PoC已公开(CVE-2025-61927)
java·c语言·c++·python·php
BlackQid13 分钟前
深入理解指针Part4——字符、数组与函数指针变量
c++·后端
熬了夜的程序员23 分钟前
【LeetCode】69. x 的平方根
开发语言·算法·leetcode·职场和发展·动态规划
Vect__37 分钟前
从底层到上层的“外挂”:deque、stack、queue、priority_queue 全面拆解
数据结构·c++
草莓熊Lotso39 分钟前
C++ 手写 List 容器实战:从双向链表原理到完整功能落地,附源码与测试验证
开发语言·c++·链表·list
无限进步_41 分钟前
【C语言】杨辉三角:数学之美与编程实现的完美结合
c语言·开发语言
Cg1362691597442 分钟前
封装的实现和定义
java·开发语言
wxin_VXbishe43 分钟前
基于SpringBoot的天天商城管理系统的设计与现-计算机毕业设计源码79506
java·c++·spring boot·python·spring·django·php
武子康1 小时前
Java-146 深入浅出 MongoDB 数据插入、批量写入、BSON 格式与逻辑查询and or not操作指南
java·开发语言·数据库·sql·mongodb·性能优化·nosql