我在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