奋斗中的cc 2018-10-28 04:51 采纳率: 0%
浏览 998
已采纳

VS2017对二进制文件写入和读出是乱麻麻

代码:#include
#include
using namespace std;
struct student
{
int num;
char name[20];
float score;
};
int main()
{
student stud[5] = { 1001,"Li",85,1002,"Fan",97.5,1004,"Wang",54,1006,"Tan",76.5,1010,"Ling",96 };
fstream iofile("stud.dat", ios::in | ios::out | ios::binary);
if (!iofile)
{
cerr << "open error!" << endl;
abort();
}
for (int i = 0; i < 5; i++)
iofile.write((char*)&stud[i], sizeof(stud[i]));
student stud1[5];
for (int i = 0; i < 5; i = i + 2)
{
iofile.seekg(i * sizeof(stud[i]), ios::beg);
iofile.read((char*)&stud[i / 2], sizeof(stud1[0]));
cout << stud1[i / 2].num << " " << stud1[i / 2].name << " " << stud1[i / 2].score << endl;
}
cout << endl;
stud[2].num = 1012;
strcpy_s(stud[2].name, "Wu");
stud[2].score = 60;
iofile.seekg(2 * sizeof(stud[0]), ios::beg);
iofile.write((char*)&stud[2], sizeof(stud[2]));
iofile.seekg(0, ios::beg);
for (int i = 0; i < 5; i++)
{
iofile.read((char*)&stud[i], sizeof(stud1[i]));
cout << stud1[i].num << " " << stud1[i].name << " " << stud1[i].score << endl;
}
iofile.close();
return 0;
}

运行结果:图片说明

  • 写回答

1条回答 默认 最新

  • threenewbee 2018-10-28 05:22
    关注
     // Q704572.cpp : Defines the entry point for the console application.
    //
    
    #include "stdafx.h"
    
    #include<fstream> 
    #include<iostream>
    using namespace std;
    struct student
    {
    int num;
    char name[20];
    float score;
    };
    int main()
    {
    student stud[5] = { 1001,"Li",85,1002,"Fan",97.5,1004,"Wang",54,1006,"Tan",76.5,1010,"Ling",96 };
    fstream iofile("c:\\stud.dat", ios::in | ios::out | ios::binary);
    if (!iofile)
    {
    cerr << "open error!" << endl;
    abort();
    }
    for (int i = 0; i < 5; i++)
    iofile.write((char*)&stud[i], sizeof(student));
    student stud1[5];
    for (int i = 0; i < 5; i++)
    {
    iofile.seekg(i * sizeof(student), ios::beg);
    iofile.read((char*)&stud1[i], sizeof(student));
    cout << stud1[i].num << " " << stud1[i].name << " " << stud1[i].score << endl;
    }
    cout << endl;
    stud[2].num = 1012;
    strcpy_s(stud[2].name, "Wu");
    stud[2].score = 60;
    iofile.seekg(2 * sizeof(stud[0]), ios::beg);
    iofile.write((char*)&stud[2], sizeof(stud[2]));
    iofile.seekg(0, ios::beg);
    for (int i = 0; i < 5; i++)
    {
    iofile.read((char*)&stud[i], sizeof(stud1[i]));
    cout << stud1[i].num << " " << stud1[i].name << " " << stud1[i].score << endl;
    }
    iofile.close();
    return 0;
    }
    

    图片说明

    如果问题得到解决,请点我回答右边的采纳,谢谢


    补充下,后面的也不对,你
    stud[2].num = 1012;
    strcpy_s(stud[2].name, "Wu");
    stud[2].score = 60;
    iofile.seekg(2 * sizeof(stud[0]), ios::beg);
    iofile.write((char*)&stud[2], sizeof(stud[2]));
    更新的是stud
    但是最后循环输出的是stud1,所以更新了看不到变化。
    这个你自己修改下吧。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 4月3日

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 MATLAB动图问题
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名