鱼C论坛

 找回密码
 立即注册
查看: 1496|回复: 4

二进制文件读取的问题

[复制链接]
发表于 2020-7-4 15:03:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

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


  4. using namespace std;

  5. struct Student
  6. {
  7.         string name;
  8.         int num;
  9.         int age;
  10.         char sex;
  11. };


  12. int main ()
  13. {
  14.         Student s1[3];
  15.        
  16.         ifstream infile ("stud.dat",ios::binary);
  17.         if(!infile)
  18.         {
  19.                 cerr << "open error!" << endl;
  20.                 exit (1);
  21.         }
  22.        
  23.         for(int i = 0;i<3;i++)
  24.         {
  25.                 infile.read((char*)&s1[i],sizeof(s1[i]));
  26.                
  27.                
  28.         }
  29.        
  30.         infile.close();
  31.        
  32.         for(int i = 0;i<3;i++)
  33.         {
  34.                 cout << s1[i].age << endl;
  35.                 cout << s1[i].name << endl;
  36.                 cout << s1[i].num << endl;
  37.                 cout << s1[i].sex << endl <<endl;
  38.        
  39.                
  40.         }
  41.        
  42.        
  43.        
  44.         return 0;
  45. }
复制代码

这是那个文件的内容
lishi                    m   zhangshan                 m   cuihua                    f   
不知道是因为是二进制输入进去的原因是个乱码,还是说,我本来写入的时候就出错了;
希望有前辈可以指点一下,谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-7-4 22:51:51 | 显示全部楼层
本帖最后由 superbe 于 2020-7-24 18:34 编辑

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

  4. using namespace std;

  5. struct Student
  6. {
  7.     string name;
  8.     int num;
  9.     int age;
  10.     char sex;
  11. };

  12. int main()
  13. {
  14.     Student s1[3] = {
  15.         {"zhangsan", 1, 20, 'M'},
  16.         {"lisi", 2, 21, 'F'},
  17.         {"wangwu", 3, 22, 'M'} };

  18.     //写入文件
  19.     ofstream outfile("stud.dat", ios::binary);
  20.     if (!outfile) {
  21.         cerr << "open error!" << endl;
  22.         exit(1);
  23.     }
  24.     for (int i = 0; i < 3; i++) {
  25.         size_t sz = s1[i].name.size();
  26.         outfile.write((char *)&sz, sizeof(size_t));  //保存name字符串长度
  27.         outfile.write(s1[i].name.c_str(), sz);       //保存name字符串
  28.         outfile.write((char *)&s1[i].num, sizeof(int));
  29.         outfile.write((char *)&s1[i].age, sizeof(int));
  30.         outfile.write((char *)&s1[i].sex, sizeof(char));

  31.     }
  32.     outfile.close();

  33.     //读出文件
  34.     ifstream infile("stud.dat", ios::binary);
  35.     if (!infile){
  36.         cerr << "open error!" << endl;
  37.         exit(1);
  38.     }
  39.     Student s2[3];
  40.     for (int i = 0; i < 3; i++) {
  41.         size_t sz;
  42.         infile.read((char *)&sz, sizeof(size_t));
  43.         s2[i].name.resize(sz);
  44.         infile.read((char *)s2[i].name.data(), sz);
  45.         infile.read((char *)&s2[i].num, sizeof(int));
  46.         infile.read((char *)&s2[i].age, sizeof(int));
  47.         infile.read((char *)&s2[i].sex, sizeof(char));
  48.     }
  49.     infile.close();

  50.     for (int i = 0; i<3; i++) {
  51.         cout << "#" << i + 1 << ":  ";
  52.         cout << s2[i].age << " "
  53.             << s2[i].name << " "
  54.             << s2[i].num << " "
  55.             << s2[i].sex << endl;
  56.     }

  57.     return 0;
  58. }
复制代码


运行结果:
#1:  20 zhangsan 1 M
#2:  21 lisi 2 F
#3:  22 wangwu 3 M
请按任意键继续. . .
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-5 11:06:17 | 显示全部楼层
rapidjson 了解一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-6 17:43:49 | 显示全部楼层
赚小钱 发表于 2020-7-5 11:06
rapidjson 了解一下

用这个编译器,来做啥?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-6 19:10:47 | 显示全部楼层
https://github.com/divinerapier/cxx-samples 写了一个本地可用的 sample code
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-1 23:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表