梵子O_o 2022-12-24 18:27 采纳率: 100%
浏览 32
已结题

读写文件到vector容器时的一点问题


#include<iostream>
#include<fstream>
#include<vector>
using namespace std;
static int counts = 0;
struct student {
    vector <float> score;
};
class CView {
private:
    vector<student> data;
public:
    CView() {
        load();
    }
    ~CView() {
        save();
    }
    student InPut() {
        student st;
        float sc;
        for (int i = 0; i < 3; i++) {
            cin >> sc;
            st.score.push_back(sc);
        }
        return st;
    }
    void Insert(const student st) {
        data.push_back(st);
        counts++;
    }
    void Print() {
        for (auto& x : data) {
            for (int i = 0; i < 3; i++) {
                cout << x.score[i] << " ";
            }
            cout << endl;
        }
    }
    void load() {
        ifstream ifile("student.txt");
        if (!ifile)
        {
            cerr << "file open error " << endl;
            return;
        }
        ifile >> counts;
        student st;
        float s = 0;
        for (int i = 0; i < counts; ++i)
        {
            for (int j = 0; j < 3; ++j)
            {
                ifile >> s;
                st.score.push_back(s);
            }
            data.push_back(st);
        }
    }
    void save() {
        ofstream ofile("student.txt");
        if (!ofile)
        {
            cerr << "file open error " << endl;
            return;
        }
        student st;
        ofile << data.size() << endl;
        for (auto x : data) {
            for (int i = 0; i < 3; i++) {
                ofile << x.score[i] << " ";
            }
            cout << endl;
        }
    }
};
int main() {
    CView cont;
    student stu;
    int selete = 0;
    do {
        cout << "1.插入" << endl;
        cout << "2.打印" << endl;
        cout << "3.退出" << endl;
        cin >> selete;
        switch (selete) {
        case 1:
            stu = cont.InPut();
            cont.Insert(stu);
            break;
        case 2:
            cont.Print();
            break;
        case 3:
            break;
        default:
            cout << "输入错误" << endl;
        }
    } while (selete != 0);
    return 0;
}

第一次运行程序打印时是正常的

img

第二次载入数据之后打印就成这样了

img

我想到的是在读取数据时出错了,经过调式,我发现在读取时将数据读到了同一个容器中,但是在不改动结构的基础上不知道怎么改

  • 写回答

2条回答 默认 最新

  • 梵子O_o 2022-12-26 09:23
    关注

    恩,找到原因了。读取的时候,每push完一个student结构体后,要再重新定义student结构体,这样才能正确的将数据读到对应的容器里。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 1月5日
  • 已采纳回答 1月5日
  • 修改了问题 12月25日
  • 修改了问题 12月25日
  • 展开全部

悬赏问题

  • ¥170 如图所示配置eNSP
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥15 键盘指令混乱情况下的启动盘系统重装