Доброго времени суток, появилась проблема: есть структура, читаю из файла, нужно вывести только те спектакли, которые поставленны введенным режиссером. Проблема заключается в том, что в структуре все данные объявлены как string, а не char (тут я знаю как сортировать по алфавиту), а замена стринга на чар приводит к ошибке Lvalue required, если не ошибаюсь, пытается присвоить что-то константе mas[20], хотя этого нельзя сделать. Кто знает подскажите пожалуйста.
#include <iostream>
#include <windows.h>
#include <iomanip>
#include <fstream.h>
#include <ostream.h>
#include <string>
using namespace std;
struct theatre
{
string spekt;
string avtor;
string rezhiser;
string data;
string time;
};
void print(theatre mas[20],int nomer)
{
int j=1;
for (int i = 0; i < nomer; i++)
{
cout<<"\n"<<j<<")";
cout<<" Nazvanie: "<<mas[i].spekt<<endl<<" Avtor: "<<mas[i].avtor<<
endl<<" Rezhiser: "<<mas[i].rezhiser<<endl<<" Data: "<<mas[i].data<<endl<<
" Vremya: "<<mas[i].time<<endl;
j++;
}
}
void change(theatre mas[20],int element)
{
cout<<"Nazvanie: ", cin>>mas[element-1].spekt;
cout<<"Avtor: ", cin>>mas[element-1].avtor;
cout<<"Rezhiser: ", cin>>mas[element-1].rezhiser;
cout<<"Data: ", cin>>mas[element-1].data;
cout<<"Vremya: ", cin>>mas[element-1].time;
}
int del(theatre mas[20],int element,int nomer)
{
int j=0;
mas[element-1].spekt="del";
for (int i = 0; i < nomer; i++)
if (mas[i].spekt != "del")
{
mas[j].spekt = mas[i].spekt;
mas[j].avtor = mas[i].avtor;
mas[j].rezhiser = mas[i].rezhiser;
mas[j].data = mas[i].data;
mas[j].time = mas[i].time;
j++;
}
cout<<"Zapis' udalena!\n";
return nomer=nomer-1;
}
void save(theatre mas[20], int nomer)
{
ofstream f("baza.txt");
for (int i = 0; i < nomer; i++)
if (i!= nomer-1)
{
f<<mas[i].spekt; f<<endl;
f<<mas[i].avtor; f<<endl;
f<<mas[i].rezhiser; f<<endl;
f<<mas[i].data; f<<endl;
f<<mas[i].time; f<<endl;
}
else
{
f<<mas[i].spekt; f<<endl;
f<<mas[i].avtor; f<<endl;
f<<mas[i].rezhiser; f<<endl;
f<<mas[i].data; f<<endl;
f<<mas[i].time; f<<endl;
}
f.close();
cout<<"Dannye sohraneny v file 'baza.txt'.\n";
}
int main()
{
theatre mas[20];
int b,element,nomer=0;
string c;
cout<<"Chtenie dannyh iz faila 'baza.txt'...\n";
ifstream f("baza.txt");
while (!f.eof())
{
f>>mas[nomer].spekt;
f>>mas[nomer].avtor;
f>>mas[nomer].rezhiser;
f>>mas[nomer].data;
f>>mas[nomer].time;
nomer++;
}
f.close();
while (true)
{
cout<<"\nVyberite odno iz deistvii:\n";
cout<<"1) Izmenit' zapis'.\n2) Udalit' zapis'.\n3) Prosmotret' dannye.\n";
cout<<"4) Sohranit' dannye.\n5) Informaciya o spektaklyah, postavlennyh";
cout<<" dannym rezhiserom.\n6) Exit.\n";
cin>>b;
switch(b)
{
case 1:
{
cout<<"Vvedite nomer izmenyaemoi zapisi: ";
cin>>element;
change(mas,element);
break;
}
case 2:
{
cout<<"Vvedite nomer udalyaemoi zapisi: ";
cin>>element;
nomer=del(mas,element,nomer);
break;
}
case 3:
{
print(mas,nomer);
break;
}
case 4:
{
save(mas,nomer);
break;
}
case 5:
{
/* theatre tmp;
bool sort = true;
int i;
string a;
while (sort)
{
sort=false;
for (i=0; i < nomer-1; i++)
if ((strlen(mas[i].spekt)>(strlen(mas[i+1].spekt))
{
tmp=mas[i];
mas[i]=mas[i+1];
mas[i+1]=tmp;
sort=true;
}
}
cout<<"\nVvedite familiyu rezhisera: ";
cin>>a;
if (a == mas[i].rezhiser)
{
int j=1;
for (int i = 0; i < nomer; i++)
{
cout<<j<<")/n";
cout<<"Nazvanie: "<<mas[i].spekt<<endl<<"Avtor: "<<mas[i].avtor<<
endl<<"Rezhiser: "<<mas[i].rezhiser<<endl<<"Data: "<<mas[i].data<<endl<<
"Vremya: "<<mas[i].time<<endl;
}
}
else
{
cout<<"\nSpektaklei, postavlennyh dannym rezhisserom net!\n";
} */
}
case 6: return 0;
default: cout<<"Nevernye dannye!\n";
}
}
system("pause");
return 0;
}
#include <iostream>
#include <windows.h>
#include <iomanip>
#include <fstream.h>
#include <ostream.h>
#include <string>
#include <algorithm>
#include <vector>
using namespace std;
bool compare(const string &a, const string &b)
{
return a.length()<b.length();
}
struct theatre
{
string spekt;
string avtor;
string rezhiser;
string data;
string time;
bool operator<(theatre ob2)
{
return (spekt < ob2.spekt);
}
};
void print(theatre mas[20],int nomer)
{
int j=1;
for (int i = 0; i < nomer; i++)
{
cout<<"\n"<<j<<")";
cout<<" Nazvanie: "<<mas[i].spekt<<endl<<" Avtor: "<<mas[i].avtor<<
endl<<" Rezhiser: "<<mas[i].rezhiser<<endl<<" Data: "<<mas[i].data<<endl<<
" Vremya: "<<mas[i].time<<endl;
j++;
}
}
void change(theatre mas[20],int element)
{
cout<<"Nazvanie: ", cin.ignore(), getline(cin,mas[element-1].spekt);
cout<<"Avtor: ", cin.ignore(), getline(cin,mas[element-1].avtor);
cout<<"Rezhiser: ", cin.ignore(), getline(cin,mas[element-1].rezhiser);
cout<<"Data: ", cin.ignore(), getline(cin,mas[element-1].data);
cout<<"Vremya: ", cin.ignore(), getline(cin,mas[element-1].time);
}
int del(theatre mas[20],int element,int nomer)
{
int j=0;
mas[element-1].spekt="del";
for (int i = 0; i < nomer; i++)
if (mas[i].spekt != "del")
{
mas[j].spekt = mas[i].spekt;
mas[j].avtor = mas[i].avtor;
mas[j].rezhiser = mas[i].rezhiser;
mas[j].data = mas[i].data;
mas[j].time = mas[i].time;
j++;
}
cout<<"Zapis' udalena!\n";
return nomer=nomer-1;
}
void save(theatre mas[20], int nomer)
{
ofstream f("baza.txt");
for (int i = 0; i < nomer; i++)
if (i!= nomer-1)
{
f<<mas[i].spekt; f<<endl;
f<<mas[i].avtor; f<<endl;
f<<mas[i].rezhiser; f<<endl;
f<<mas[i].data; f<<endl;
f<<mas[i].time; f<<endl;
}
else
{
f<<mas[i].spekt; f<<endl;
f<<mas[i].avtor; f<<endl;
f<<mas[i].rezhiser; f<<endl;
f<<mas[i].data; f<<endl;
f<<mas[i].time; f<<endl;
}
f.close();
cout<<"Dannye sohraneny v file 'baza.txt'.\n";
}
int main()
{
theatre mas[20];
int b,element,nomer=0;
string c;
vector<theatre>teatr;
cout<<"Chtenie dannyh iz faila 'baza.txt'...\n";
ifstream f("baza.txt");
while (!f.eof())
{
f>>mas[nomer].spekt;
f>>mas[nomer].avtor;
f>>mas[nomer].rezhiser;
f>>mas[nomer].data;
f>>mas[nomer].time;
teatr.push_back(*mas);
nomer++;
}
f.close();
while (true)
{
cout<<"\nVyberite odno iz deistvii:\n";
cout<<"1) Izmenit' zapis'.\n2) Udalit' zapis'.\n3) Prosmotret' dannye.\n";
cout<<"4) Sohranit' dannye.\n5) Informaciya o spektaklyah, postavlennyh";
cout<<" dannym rezhiserom.\n6) Exit.\n";
cin>>b;
switch(b)
{
case 1:
{
cout<<"Vvedite nomer izmenyaemoi zapisi: ";
cin>>element;
change(mas,element);
break;
}
case 2:
{
cout<<"Vvedite nomer udalyaemoi zapisi: ";
cin>>element;
nomer=del(mas,element,nomer);
break;
}
case 3:
{
print(mas,nomer);
break;
}
case 4:
{
save(mas,nomer);
break;
}
case 5:
{
cout<<"Vvedite familiyu rezhisera: ", cin.ignore(), getline(cin, c);
int j=1;
for (int i=0; i < nomer; i++)
if (c == mas[i].spekt)
{
sort(teatr.begin(), teatr.end());
cout<<"\n"<<j<<")";
cout<<" Nazvanie: "<<mas[i].spekt<<endl<<" Avtor: "<<mas[i].avtor<<
endl<<" Rezhiser: "<<mas[i].rezhiser<<endl<<" Data: "<<mas[i].data<<endl<<
" Vremya: "<<mas[i].time<<endl;
j++;
}
else
cout<<"Takogo rezhisera net!\n";
}
case 6: return 0;
default: cout<<"Nevernye dannye!\n";
}
}
system("pause");
return 0;
}
struct theatre- проект будет компилироваться.
{
string spekt;
string avtor;
string rezhiser;
string data;
string time;
};
// Я вот это имел в виду:
bool operator < (const theatre &a, const theatre &b)
{
return a.avtor < b.avtor;
}
case 5:
{
cout<<"Vvedite familiyu rezhisera: ", cin.ignore(), getline(cin, c);
int j = 0;
for(int i = 0; i < nomer; i++)
{
if(mas[i].rezhiser == c)
{
j += 1;
cout<<"\n"<<j<<")";
cout<<" Nazvanie: "<<mas[i].spekt<<endl
<<" Avtor: "<<mas[i].avtor<<endl
<<" Rezhiser: "<<mas[i].rezhiser<<endl
<<" Data: "<<mas[i].data<<endl
<<" Vremya: "<<mas[i].time<<endl;
}
}
if(!j)
{
cout<<"Takogo rezhisera net!\n";
}
break;
}
struct theatre- проект будет компилироваться.
{
string spekt;
string avtor;
string rezhiser;
string data;
string time;
};
// Я вот это имел в виду:
bool operator < (const theatre &a, const theatre &b)
{
return a.avtor < b.avtor;
}
Какого языка? С++? На С++ это вообще вот так делается:
struct theatre
{
friend ostream& operator << (ostream& os, const theatre& th);
string spekt;
string avtor;
string rezhiser;
string data;
string time;
};
// Перегружаем оператор вывода в поток
ostream& operator << (ostream& os, const theatre& th)
{
os << " Nazvanie: " << th.spekt << endl
<< " Avtor: " << th.avtor << endl
<< " Rezhiser: " << th.rezhiser << endl
<< " Data: " << th.data << endl
<< " Vremya: " << th.time << endl;
return os;
}
// пишем свой функтор, который будет сравнивать поле структуры со строкой
struct finder : std::binary_function<theatre, string, bool>
{
bool operator()(theatre const &in, string id) const
{
return (id == in.rezhiser);
}
};
// ...
// и, наконец, как сделать поиск по введенному режиссеру:
case 5:
{
string to_find;
cout << "Введите фамилию режиссера: ", cin.ignore(), getline(cin, to_find);
remove_copy_if(teatr.begin(), teatr.end(), std::ostream_iterator<theatre>(std::cout,"\n"),
std::not1(bind2nd(finder(), to_find)));
break;
}