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;
}
相关推荐
倒头就睡的小比特1 天前
算法竞赛C++常用的STL
c++·算法
weilx12341 天前
C++笔记-文件IO-<fcntl.h>
c++
小羊没烦恼!1 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
伞伞悦读1 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
Smileyqp沛沛1 天前
前端?C++ ?较大差异基础罗列
c++·基础·前端转c++
C语言小火车1 天前
C/C++ 为什么需要编译器?
开发语言·c++
旖旎夜光1 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
吞下星星的少年·-·1 天前
C++ 萌新语法入门篇
c++·算法比赛
霍霍的袁1 天前
【C++】map 和 set 的使用 | 从用法到底层
开发语言·c++·学习·visual studio
another heaven1 天前
【算法/C++ MD5算法能否逆解码?原理、C++实现与同类哈希算法对比】
c++·算法·哈希算法