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-------------ついに完了しました!入力、出力、削除は順調に進んでいます。わずかな問題の1つは、「sr」がシリアル番号ではなくメモリ値を取得していることです。ファイルからの値。したがって、2番目のプレイリストを2.Secondプレイリストとして印刷する代わりに、2609.Secondプレイリストを印刷します。
皆さん、ありがとうございました。私は本当に感謝しています、あなたは私をたくさん助けてくれました!@WhozCraigと@qPCRvir:皆さんの回答とアドバイスに感謝します。本当に感謝しています。:)