根据批号在C ++中将学生记录分组到二进制文件中?

时间:2016-03-31 14:09:09

标签: c++ sorting console-application binaryfiles turbo-c++

我在C ++中使用控制台应用程序(我是初学者) 目的是制作一个可以存储,阅读和修改学生记录的小型应用程序

现在,我想分组二进制文件(class9.dat)的数据,这样所有具有共同批处理ID(char类型批处理[5])的学生应该粘在一起,说"粘在一起&#34 ;, 我的意思是 如果最初,考虑二进制文件考虑这种形式的数据

[Tom , 2] 
[Harry, 1] 
[Peter, 2] 
[Stephen, 1]  
[Henry , 0]

然后,在将数据粘贴在一起(或将它们分组)后,数据应按文件排列如下

[Tom , 2]
[Peter, 2] 
[Harry, 1]
[Stephen, 1]
[Henry , 0]

(请注意,数据按照从上到下首先读取/遇到的顺序排列)

好吧,现在我尝试了很多,甚至我认为我找到了解决这个问题的方法,我使用动态链表(堆栈)的概念来检查特定批次ID是否排列正确

下面的

是函数void_update()

的代码片段
void update_files() 
{
    fin.open("class9.dat",ios::in|ios::binary);

    fout.open("temp.dat",ios::out|ios::binary);
    int total_records,pos,rec,temp;
    char temp_batch[5];
    fin.seekg(0,ios::beg);
    fin.read((char*)&s,sizeof(s));
    fin.seekg(0,ios::end);
    pos=fin.tellg();
    total_records=pos/sizeof(s);
    fin.seekg(0,ios::beg);
    rec=0;

    while(rec<total_records)
    {   fin.seekg(rec*sizeof(s),ios::beg);
        fin.read((char*)&s,sizeof(s));
        strcpy(temp_batch,s.get_char(3));
        temp=checklist(temp_batch); //function checks whether batch already in stack or not (either already sorted together or not)
        if(temp==0)
        {
            fin.seekg(0,ios::beg); //move to first record
            while(fin.read((char*)&s,sizeof(s)))
            {
                if(strcmpi(temp_batch,s.get_char(3))==0) //get_char(3) returns student batch id
                {
                    fout.write((char*)&s,sizeof(s));//writting copies of data to temp.dat where they are expected to be grouped together 
                }

            }
            push_to_stack(temp_batch);//SEND TEMP_BATCH TO STACK
        }
        rec++; 
    }
    fout.close();
    fin.close();
    delete_stacks(); //delete dynamic stack
    fin.open("temp.dat",ios::in|ios::binary);
    fout.open("class9.dat",ios::out|ios::binary);
    while(fin.read((char*)&s,sizeof(s)))//writting sorted data back into class9.dat file from temp.dat
    {
        fout.write((char*)&s,sizeof(s));
    }
    fin.close();
    fout.close();


}

这是功能代码片段,供您参考我留下其他两个属于堆栈的函数的代码片段 他们在这里

struct node
{
    char batches[5];
    node *next;
}*start=NULL,*end=NULL, *temp;
void push_to_stack(char* b)
{
    temp=new(node);
    if(temp==NULL)
    {
        cout<<"FATAL ERROR : MEMORY OVERFLOW ";
        cout<<"\n YOUR SYSTEM RAN OUT OF MEMORY. PLEASE RESTART THE SYSTEM \n";
        cout<<"\n \n TERMINATING STUDENT DATA MANAGER !!!";
        getch();
        exit(0);
    }
    strcpy(temp->batches,b);
    temp->next=start;
    if(end==NULL)
    {
        end=temp;
    }
    start=temp;
}
int checklist(char *b)
{
    temp=start;
    while(temp!=NULL)
        {
            if(strcmpi(b,temp->batches)==0) //matched 
            {
                return 1;//yes ,BATCH IS EXIsTS
            }
            else temp=temp->next;

        }
    return 0;
}
void delete_stacks()
{   node *save;
    save=start;
    if(save==NULL)
        return;
    else
    while(start!=NULL)
    {
        save=start;
        if(save==NULL)
            break;
        start=start->next;
        delete(save);
    }
    return;
}

就是这样,现在让我告诉你我解决这个问题的方法

我试图做的基本上是我将学生的批处理ID传递给另一个char变量temp_batch,然后我检查我的堆栈中是否存在temp_batch(其中包含已执行该功能的所有批处理ID的列表) 如果我的堆栈中不存在temp_batch那么,这意味着批处理ID为temp_batch的数据没有被分组,所以运行一个while循环,从头到尾读取整个文件,当它找到批处理ID相同的记录时temp_batch,它以这种方式附加到temp.dat,用于文件中的每个记录,它应该将记录组合​​在一起。但这不起作用 什么问题是,当我运行此代码 而不是对所有记录进行分组,它只是首先遇到的那个BATCH ID的GROUPS UP记录,休息它忽略所有其他记录并且不将它们发送到temp.dat 例如,考虑上面的例子,那么这是在整个过程之后将被发送到temp.dat的记录

[Tom , 2]
[Peter, 2] 

请帮助我,我做了很多代码检查,一次又一次但未能解决问题......是的,感谢您阅读整个问题到目前为止。

编辑/更新问题: 有些人还问过&#34; s&#34;在fin / fout语句中,这里很好 s是下面定义的班级学生的对象

    class student
    {
        private:
            char name[50],address[100];
            char age[5];//this is a replacement
            char sub1[80],sub2[80];
            int standard;//int class
            char id[6];
            char mobile[16];
            char mobile2[16];
            char batch[5]; //this is the batch id im talking about, on basis of which records need to be grouped together


        public:
        /*1*/
            //--------------------------
            void getdata(int); //gets data, this is just declaration here
            int countname(char *names); // ignore this
            int countid(char *sid); //ignore this
            void showdata(); //ignore this
            void new_data(int);//ignore this 
            void changeclass(); //ignore this 

            //below is a function you might be interested in
            char *get_char(int code) // 0 (ID) , 1(AGE) , 2 (NAME) , 3(BATCH)
            {
                if(code==0)
                    return id; //char
                else if(code==1)
                    return age; //char
                else if(code==2)
                    return name;
                else if(code==3)
                    return batch;
            }
 //this function below returns student's standard (or class in common language day to day life)
            int get_class()
            {   return standard;
            }
            //--------------------------

    }s; //end of class , created object s for student

0 个答案:

没有答案