我一直在使用 Turbo C++ (:/) 并且遇到了一个问题。
我正在制作一个需要文件处理的学校项目。我的程序接受用户的输入并为他们提供 4 个选项:
- 覆盖/修改现有文件
- 创建文件
- 删除文件
- 查看所有文件
类定义:
#define max 20
class playlist{
static int ctr;
int sr;
char name[max];
class favsong
{
char song[max];
char genre[max];
char artist[max];
int rating;
public:
void playin()
{
cout<<"Enter song name"<<endl;
gets(song);
cout<<"Enter genre"<<endl;
gets(genre);
cout<<"Enter artist"<<endl;
gets(artist);
cout<<"Enter rating (out of 5)"<<endl;
cin>>rating;
}
void playout()
{
cout<<"\nSong:";
puts(song);
cout<<"Artist:";
puts(artist);
cout<<"Genre:";
puts(genre);
cout<<"rating:"<<rating<<endl;
}
favsong()
{
rating=0;
strcpy(song,"Not Assigned");
strcpy(genre,"Not Assigned");
strcpy(artist,"Not Assigned");
}
~favsong(){}
}favs[5];
public:
void input();
void output();
void showname()
{
puts(name);
}
int givesr()
{
return sr;
}
int existp (int n)
{
if(n==sr)
return 1;
else
return 0;
}
playlist()//constructor
{
strcpy(name,"Default playlist");
sr=ctr;
ctr++;
}
~playlist(){}
int existp(char arr[])
{
if(strcmp(name,arr)==0)
return 1;
else
return 0;
}
}wmp[max],obj;
int playlist::ctr=1;
void playlist::input()
{
cout<<"Enter playlist name"<<endl;
gets(name);
for(int i=0;i<5;i++)
favs[i].playin();
cout<<"Input complete"<<endl;
}
void playlist::output()
{
cout<<"Playlist no"<<sr;
for(int i=0;i<5;i++)
favs[i].playout();
cout<<"\noutput complete"<<endl;
}
当我尝试创建播放列表时,我遇到了运行时错误:代码:
case 2: cout<<"Creating new playlist...press enter to continue"<<endl;
getch();
obj.input();
h=0;
while(!file.eof()){
fileo.read((char*)&wmp[h],sizeof(wmp));
if(wmp[h].existp("Default playlist")){ //int existp(int*a) compares the object's
// name to the string"Default Playlist
pos=fileo.tellg();
file.seekp(-pos,ios::cur);
file.write((char*)&wmp,sizeof(wmp) );
}
h++;
}
break;
我已经做了3天了。看起来很简单,但我不知道问题出在哪里。
此外,每次运行后文件都会被擦除:代码:
ofstream file("playlist.dat",ios::out|ios::app|ios::noreplace|ios::binary|ios::ate);
ifstream fileo("playlist.dat",ios::in|ios::binary);
- - - - - - -编辑 - - - - - -
我接受了 WhozCraig 和 qPCR4vir 的建议,并为班级成员提供了单独的功能将自己插入文件中。事情是我再次遇到了障碍。输出显示所有数据成员,而它应该只显示 sr 号。和播放列表名称。我认为输入或输出是错误的。代码:
void existp() //function to show all existing playlists in the file.
{ ifstream tmp("playlist.dat",ios::in|ios::binary);
tmp.seekg(ios::beg);
tmp.read((char*)&wmp,sizeof(wmp));
for(int i=0;i<max;i++){
cout<<wmp[i].givesr();
wmp[i].showname();
}
tmp.close();
}
void fileput(){ //fileput and fileget are functions to put inner class member in //file
ofstream file("Playlist.dat",ios::out|ios::app|ios::nocreate|ios::binary);
file<<song<<endl<<artist<<endl<<genre<<endl<<rating<<endl;
file.close();
}
void fileget(){
ifstream file("Playlist.dat",ios::in|ios::binary);
file.getline(song,max,'\n');
file.getline(artist,max,'\n');
file.getline(genre,max,'\n');
file>>rating;
file.close();
}
//外部类函数的函数定义,将外部类数据成员放入文件中
void playput(long int pos){
ofstream file("Playlist.dat",ios::out|ios::app|ios::nocreate|ios::binary);
file.seekp(pos,ios::beg);
file<<name<<"\n";
for(int i=0;i<5;i++)
favs[i].fileput();
file.close();
}
void playget(long int pos){
ifstream file("Playlist.dat",ios::in|ios::binary);
file.seekg(pos,ios::beg);
file.getline(name,max,'\n');
for(int i=0;i<5;i++)
favs[i].fileget();
file.close();
}
-------------编辑2------------- 终于完成了!输入,输出,删除都很好。只有一个小问题是“sr”正在获取内存值而不是序列号。文件中的值。因此,不是将第二个播放列表打印为 2.Second Playlist,而是打印 2609.Second Playlist。
谢谢你们,你们所有人。我真的很感激,你真的帮了我很多!@WhozCraig 和@qPCRvir:谢谢你们的回答和建议。我真的很感激。:)