光着屁股的犀牛 发表于 2020-7-4 15:03:09

二进制文件读取的问题

本帖最后由 光着屁股的犀牛 于 2020-7-4 15:06 编辑

我想请问一下二进制文件的问题,自己按着书上的内容打的二进制读取的代码,结果读取不出来东西,求助
#include <iostream>
#include <string >
#include <fstream>


using namespace std;

struct Student
{
        string name;
        int num;
        int age;
        char sex;
};


int main ()
{
        Student s1;
       
        ifstream infile ("stud.dat",ios::binary);
        if(!infile)
        {
                cerr << "open error!" << endl;
                exit (1);
        }
       
        for(int i = 0;i<3;i++)
        {
                infile.read((char*)&s1,sizeof(s1));
               
               
        }
       
        infile.close();
       
        for(int i = 0;i<3;i++)
        {
                cout << s1.age << endl;
                cout << s1.name << endl;
                cout << s1.num << endl;
                cout << s1.sex << endl <<endl;
       
               
        }
       
       
       
        return 0;
}
这是那个文件的内容
lishi                  m   zhangshan               m   cuihua                  f   
不知道是因为是二进制输入进去的原因是个乱码,还是说,我本来写入的时候就出错了;
希望有前辈可以指点一下,谢谢

superbe 发表于 2020-7-4 22:51:51

本帖最后由 superbe 于 2020-7-24 18:34 编辑

name成员如果是char数组比较容易处理,但如果是string用二进制来处理就比较麻烦,因为string实际上并没有包含字符串本身,而是字符串的地址。一个思路是,保存string的字符串长度和字符串内容,读取时先读长度再按长度读字符串到string。
下面是测试代码:
#include <iostream>
#include <string >
#include <fstream>

using namespace std;

struct Student
{
    string name;
    int num;
    int age;
    char sex;
};

int main()
{
    Student s1 = {
      {"zhangsan", 1, 20, 'M'},
      {"lisi", 2, 21, 'F'},
      {"wangwu", 3, 22, 'M'} };

    //写入文件
    ofstream outfile("stud.dat", ios::binary);
    if (!outfile) {
      cerr << "open error!" << endl;
      exit(1);
    }
    for (int i = 0; i < 3; i++) {
      size_t sz = s1.name.size();
      outfile.write((char *)&sz, sizeof(size_t));//保存name字符串长度
      outfile.write(s1.name.c_str(), sz);       //保存name字符串
      outfile.write((char *)&s1.num, sizeof(int));
      outfile.write((char *)&s1.age, sizeof(int));
      outfile.write((char *)&s1.sex, sizeof(char));

    }
    outfile.close();

    //读出文件
    ifstream infile("stud.dat", ios::binary);
    if (!infile){
      cerr << "open error!" << endl;
      exit(1);
    }
    Student s2;
    for (int i = 0; i < 3; i++) {
      size_t sz;
      infile.read((char *)&sz, sizeof(size_t));
      s2.name.resize(sz);
      infile.read((char *)s2.name.data(), sz);
      infile.read((char *)&s2.num, sizeof(int));
      infile.read((char *)&s2.age, sizeof(int));
      infile.read((char *)&s2.sex, sizeof(char));
    }
    infile.close();

    for (int i = 0; i<3; i++) {
      cout << "#" << i + 1 << ":";
      cout << s2.age << " "
            << s2.name << " "
            << s2.num << " "
            << s2.sex << endl;
    }

    return 0;
}

运行结果:
#1:20 zhangsan 1 M
#2:21 lisi 2 F
#3:22 wangwu 3 M
请按任意键继续. . .

赚小钱 发表于 2020-7-5 11:06:17

rapidjson 了解一下

光着屁股的犀牛 发表于 2020-7-6 17:43:49

赚小钱 发表于 2020-7-5 11:06
rapidjson 了解一下

用这个编译器,来做啥?

赚小钱 发表于 2020-7-6 19:10:47

https://github.com/divinerapier/cxx-samples 写了一个本地可用的 sample code
页: [1]
查看完整版本: 二进制文件读取的问题