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;
}
相关推荐
.千余18 分钟前
【C++】手写双向链表:list容器模拟实现
开发语言·c++·笔记·学习·其他
liulilittle38 分钟前
过冲:拥塞控制的呼吸与盲行
linux·网络·c++·tcp/ip·计算机网络·tcp·通信
人道领域43 分钟前
【LeetCode刷题日记】93.复原IP地址
java·开发语言·算法·leetcode
caimouse43 分钟前
Reactos 第 3 章 内存管理 — 【中篇】Hyperspace、系统空间、API 与异常
c语言·开发语言·windows·架构
摇滚侠1 小时前
JavaWeb 全套教程 Listener 112-113
java·开发语言·servlet·tomcat·intellij-idea
小欣加油1 小时前
leetcode2574 左右元素和的差值
数据结构·c++·算法·leetcode·职场和发展
hixiong1231 小时前
C# Tokenizers.DotNet测试工具
开发语言·人工智能·llm
曹牧1 小时前
Java:Deprecated 是
java·开发语言
weixin_461769401 小时前
通过数组和队列构造二叉树方法(用于算法测试),C++ vector不能直接使用null
数据结构·c++·算法·vector·nullptr·null
caimouse2 小时前
Reactos 第 4 章 对象管理 — 4.1 对象与对象目录
服务器·c语言·开发语言·windows·架构