写/读结构数组数据表C ++

时间:2016-03-13 20:36:00

标签: c++ file struct

我对c ++很新,我花了大约六个小时就完成了这件事,遗憾的是没有结果。

我试图做以下事情。 (对我自己的做法)

  1. 制作类似于cmd的导航菜单。 #done
  2. 使用" uml aggregation"的概念创建两个结构。 #done
  3. 创建输入,输出,按值排序等功能。#done
  4. 将所有内容写入文件#Struggling。
  5. 从文件中回读。
  6. 稍后使用数据(按名称排序,删除最后一个对象,添加新...等)
  7. 我有一个庞大的代码,我觉得发布会很愚蠢(浪费时间),所以我只发布一个更简单的版本。

    #include <iostream>
    #include <fstream>
    #include <cstdlib>
    #include <string.h>
    using namespace std;
    
    struct man{
    char name[20];
    int age;
    
    };
    
    struct group{
    man* men[3];
    };
    
    void fill( man &y);
    void show( man &y);
    void input(group &x, man &y);
    void output(group &x, man &y);
    
    int main(){
        man q;
        group w;
    
        input(w, q);
        cout<<endl;
        output(w, q);
    
        ofstream w1file("B.dat");
        for (int i=0; i<2; i++){
            w1file.write((char*) &w.men[i]->name, 20);
            w1file.write((char*) &w.men[i]->age, sizeof(int));
        }
        w1file.close();
    
        ifstream r1file("B.dat");
    
        while(r1file.good()){
            r1file.read((char*) &w.men[0]->name, 20);
            r1file.read((char*) &w.men[0]->age,  sizeof(int));
            r1file.read((char*) &w.men[1]->name, 20);
            r1file.read((char*) &w.men[1]->age,  sizeof(int));
        }
        output(w, q);
        r1file.close();
        system("pause");
        return 0;
    }
    
        void fill( man &y){
            gets(y.name);
            cin>>y.age;
            cin.ignore();
        }    
    void show( man &y){
        cout<<y.name<<endl;
        cout<<y.age<<endl;
    }
    void input(group &x, man &y){
        x.men[2]= new man[2];
        for (int i=0; i<2;i++){
            fill(y);;
            x.men[i]= new man(y);
        }
    }
    void output(group &x, man &y){
        for (int i=0; i<2;i++){
            show(*x.men[i]);
        }
    }
    

    如果我删除了写入部分,那么只要我按下运行程序就会崩溃。 香港专业教育学院尝试过这样,并使用文件&gt;&gt;&#34;变量&#34; ...我只尝试了第一个元素...尝试将整个事物复制到一个数组,写入数组然后读取它,但没有任何作用:(

    我还希望它输出文件中的数据,如下所示:(示例)

    #in the txt, dat, whatever
    John 21
    Pier 18...etc
    

    所以我可以直接从书面文件中编辑数据。 但是我得到的是:

    John н@     А…J {   Adam ed н@     А…J Х  
    

    我最初的想法是创建一个程序,以表格的形式将数据输出到文件(希望你理解我) exmpl。

    name1 age1 wage1 married/not married1
    name2 age2 wage2 married/not married2
    name3...age3...etc
    

    来自天堂的人可以帮助我,如果可能的话,解释我做错了什么?

2 个答案:

答案 0 :(得分:0)

for (int i; i<2; i++){

查看此行,直到看到问题为止。一直看着它,直到你这样做。

提示:在此循环中,您期望i的第一个值是什么?

P.S。:为什么你为男性[0]和男性[1]分配man的单个实例,为男性分配man的两个实例[2]?

答案 1 :(得分:0)

有几个问题:

写作使用未初始化的变量i,因此它以未确定的值开始。试试:

for (int i=0; i<2; i++){   //i=0 !!    

然后在默认文本模式下打开的文件中写入二进制数据。这可以根据二进制值和操作系统改变文件中有效写入的内容。所以:

ofstream w1file("B.dat", ios::binary);  // binary mode instead of text mode

同样适用于阅读流。

请注意,您可以在该组中拥有0到3名男性。在小组的开头写一些项目是明智的。因此,在阅读小组时,您可以先读取预期的项目数,然后循环播放,直到您全部阅读完为止。你当前的阅读循环很奇怪,因为它会读取文件并不断覆盖2个第一个男人(如果文件中有更多数据)。

您可以正确阅读的方式是:

 const int maxmen=3;  
 for (int i=0; i<maxmen && r1file.read((char*) &w.men[i]->name, 20)
                   && r1file.read((char*) &w.men[0]->age, sizeof(int)); i++)
    cout << "Successfuly read item "<<i<<endl; 
 }

另请注意,此代码严重泄漏内存。