файлы
|
Новый участник Сообщения: 15 |
Профиль | Отправить PM | Цитировать Есть программа:
#include <iostream.h> #include <algorithm> #include <fstream> #include <string> #include <iterator> #include <functional> #include <windows.h> #include<istream.h> using namespace std; void RussianMessage(char *message){ char rmessage[256]; CharToOem(message,rmessage); cout<<rmessage; } int RussianMenu(){ RussianMessage("\nВведите 1 для добавления новой структуры в файл\n"); RussianMessage("Введите 2 для показа всех структур из файла\n"); RussianMessage("Введите 3 для поиска\n"); RussianMessage("Введите 4 для выхода\n"); int choice; cin>>choice; return choice; } class Man{ struct Data { Data() : age(0) {} // переменная для возраста int age; // переменная для имени std::string name; // переменная для фамилии std::string surname; friend ofstream& operator << (ofstream& stream, const Data& d) { // Записываем возраст stream<<d.age<<' '; // Записываем имя stream<<d.name.c_str()<<' '; // Записываем фамилию stream<<d.surname.c_str()<<' '; return stream; } friend fstream& operator << (fstream& stream, const Data& d) { RussianMessage("\nИмя: "); stream<<d.name.c_str(); RussianMessage("\nФамилия: "); stream<<d.surname.c_str(); RussianMessage("\nВозраст: "); stream<<d.age; return stream; } friend istream& operator >> (istream& stream, Data& d) { stream>>d.age; stream>>d.name; stream>>d.surname; return stream; } }; struct Pred:binary_function<Data,std::string, bool> { Pred(){} bool operator () (const Data& d, std::string str) const { return ( d.surname == str)? true : false; } }; Data data_; public: // конструктор с параметрами Man(char *n,char *s,int a); // конструктор Man(); // функция ввода данных void Put(); // функция показа данных void Show(); // функция сохранения в файл void SaveToFile(); // функция показа содержимого файла void ShowFromFile(); void SearchFile(); }; // конструктор Man::Man(){} // конструктор с параметрами Man::Man(char *n,char *s,int a){ data_.name.assign(n); data_.surname.assign(s); data_.age = a; } // функция ввода данных void Man::Put(){ std::string temp; RussianMessage("\nВведите имя:\n"); cin>>temp; data_.name.assign(temp); RussianMessage("\nВведите фамилию:\n"); cin>>temp; data_.surname.assign(temp); RussianMessage("\nВведите возраст\n"); cin>>data_.age; } // функция сохранения в файл void Man::SaveToFile(){ ofstream file("c:\\men.txt",ios::out|ios::app); if(!file){ RussianMessage("Файл не открылся для чтения !!!"); exit(1); } file<<data_; } void Man::SearchFile() { std::string surname; fstream file("C://men.txt",ios::in); if(!file){ RussianMessage("Файл не открылся для чтения !!!"); exit(1); } istream_iterator<Data> first(file), last , pos; RussianMessage("Введите фамилию:"); cin>>surname; pos = std::find_if(first,last,bind2nd(Pred(),surname)); if(pos == last) RussianMessage("\nТакого сотрудника нет!\n"); else cout<<*pos; } // функция показа содержимого файла void Man::ShowFromFile(){ fstream file("C://men.txt",ios::in); if(!file){ RussianMessage("Файл не открылся для чтения !!!"); exit(1); } istream_iterator<Data> first(file), last; copy(first,last, ostream_iterator<Data>(cout,"\n")); } int main(){ Man a; do{ switch(RussianMenu()){ case 1: // Добавление записи a.Put(); a.SaveToFile(); break; case 2: // Показ всех записей a.ShowFromFile(); break; case 3: a.SearchFile(); break; case 4:// Прощание с пользователем RussianMessage("До Свидания\n"); return 0; default: // Неправильный ввод RussianMessage("Неверный Ввод\n"); } }while(1); } error C2678: binary '>>' : no operator defined which takes a left-hand operand of type 'class istream_withassign' (or there is no acceptable conversion) error C2678: binary '>>' : no operator defined which takes a left-hand operand of type 'class istream_withassign' (or there is no acceptable conversion) error C2678: binary '>>' : no operator defined which takes a left-hand operand of type 'class istream_withassign' (or there is no acceptable conversion) error C2678: binary '<<' : no operator defined which takes a left-hand operand of type 'class ostream_withassign' (or there is no acceptable conversion) error C2665: 'ostream_iterator<struct Man::Data,char,struct std::char_traits<char> >:stream_iterator<struct Man::Data,char,struct std::char_traits<char> >' : none of the 2 overloads can convert parameter 1 from t ype 'class ostream_withassign' Помогите исправить!!! Пожалуста!!! |
|
Отправлено: 06:49, 24-05-2006 |
редкий гость Сообщения: 1696
|
Профиль | Сайт | Отправить PM | Цитировать farik
Цитата:
upd И ещё будет неплохо, если оно не будет ничего писать на экран. Ибо при чтении из файла вылезут три сообщения непонятно к чему. |
|
------- Последний раз редактировалось ivank, 24-05-2006 в 19:31. Отправлено: 10:52, 24-05-2006 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Новый участник Сообщения: 15
|
Профиль | Отправить PM | Цитировать Вот исправленная программа в ней всеравно ошибка :
error C2679: binary '<<' : no operator defined which takes a right-hand operand of type 'class std::istream_iterator<struct Data,char,struct std::char_traits<char> >' (or there is no acceptable conversion) Вот программа: #include <iostream> #include <algorithm> #include <fstream> #include <string> #include <vector> #include <iterator> #include <functional> using namespace std; #include "windows.h" void RussianMessage(char *message){ char rmessage[256]; CharToOem(message,rmessage); cout<<rmessage; } int RussianMenu(){ RussianMessage("\nВведите 1 для добавления новой структуры в файл\n"); RussianMessage("Введите 2 для показа всех структур из файла\n"); RussianMessage("Введите 3 для поиска\n"); RussianMessage("Введите 4 для выхода\n"); int choice; cin>>choice; return choice; } struct Data { Data() : age(0) {} // переменная для возраста int age; // переменная для имени std::string name; // переменная для фамилии std::string surname; friend ofstream& operator << (ofstream&, const Data&); friend ostream& operator << (ostream&, const Data&); friend ofstream& operator >> (istream&, Data&); }; ostream& operator << (ostream& stream, const Data& d) { RussianMessage("\nИмя: "); stream<<d.name.c_str(); RussianMessage("\nФамилия: "); stream<<d.surname.c_str(); RussianMessage("\nВозраст: "); stream<<d.age; return stream; } ofstream& operator << (ofstream& stream, const Data& d) { // Записываем возраст stream<<d.age<<' '; // Записываем имя stream<<d.name.c_str()<<' '; // Записываем фамилию stream<<d.surname.c_str()<<' '; return stream; } ofstream& operator >> (istream& stream, Data& d) { stream>>d.age; stream>>d.name; stream>>d.surname; // return stream; } struct Pred:binary_function<Data,std::string, bool> { Pred(){} bool operator () (const Data& d, std::string str) const { return ( d.surname == str)? true : false; } }; class Man{ Data data_; public: // конструктор с параметрами Man(char *n,char *s,int a); // конструктор Man(); // функция ввода данных void Put(); // функция показа данных void Show(); // функция сохранения в файл void SaveToFile(); // функция показа содержимого файла void ShowFromFile(); void SearchFile(); }; // конструктор Man::Man(){} // конструктор с параметрами Man::Man(char *n,char *s,int a){ data_.name.assign(n); data_.surname.assign(s); data_.age = a; } // функция ввода данных void Man::Put(){ std::string temp; RussianMessage("\nВведите имя:\n"); cin>>temp; data_.name.assign(temp); RussianMessage("\nВведите фамилию:\n"); cin>>temp; data_.surname.assign(temp); RussianMessage("\nВведите возраст\n"); cin>>data_.age; } // функция показа данных void Man::Show(){ RussianMessage("\nИмя:\n"); cout<<data_.name; RussianMessage("\nФамилия:\n"); cout<<data_.surname; RussianMessage("\nВозраст:\n"); cout<<data_.age<<"\n"; } // функция сохранения в файл void Man::SaveToFile(){ ofstream file("c:\\men.txt",ios::out|ios::app); if(!file){ RussianMessage("Файл не открылся для чтения !!!"); exit(1); } // file<<data_; } //****************************poisk*********************************************************** void Man::SearchFile() { std::string surname; fstream file("C://men.txt",ios::in); if(!file){ RussianMessage("Файл не открылся для чтения !!!"); exit(1); } istream_iterator<Data> first(file), last , pos; RussianMessage("Введите фамилию:"); cin>>surname; pos = std::find_if(first,last,bind2nd(Pred(),surname)); if(pos == last) RussianMessage("\nТакого сотрудника нет!\n"); else cout<<pos; } // ******************************************************************************************************************* // функция показа содержимого файла void Man::ShowFromFile(){ fstream file("C://men.txt",ios::in); if(!file){ RussianMessage("Файл не открылся для чтения !!!"); exit(1); } istream_iterator<Data> first(file), last; copy(first,last, ostream_iterator<Data>(cout,"\n")); } int main(){ Man a; do{ switch(RussianMenu()){ case 1: // Добавление записи a.Put(); a.SaveToFile(); break; case 2: // Показ всех записей a.ShowFromFile(); break; case 3: a.SearchFile(); break; case 4:// Прощание с пользователем RussianMessage("До Свидания\n"); return 0; default: // Неправильный ввод RussianMessage("Неверный Ввод\n"); } }while(1); } |
Отправлено: 20:42, 24-05-2006 | #3 |
редкий гость Сообщения: 1696
|
Профиль | Сайт | Отправить PM | Цитировать В целом код кривой и некрасивый. SaveToFile, ShowToFile и SearchFile должны быть статиками, как минимум. Соответственно структура Data должна быть переименована в Man, статическими функциями которой будут три названных выше. Так будет несколько красивше. Либо можно завести класс FileOfMen (или MenStorage ), которому в конструкторе передавть имя файла; тогда будет оправдано использование функций-членов класса.
А ошибка возникает, потому что итератор pos вы не разименовываете. Т.е. строчка cout << pos, д.б. заменена на cout << *pos. upd Ещё подумалось, раз Data - структура, то operator << и operator >> могут быть и не френдами - незачем, раз все поля открыты. |
Отправлено: 21:34, 24-05-2006 | #4 |
Новый участник Сообщения: 15
|
Профиль | Отправить PM | Цитировать Все исправил! Компилируется!!! Но не записывает в файл
Вот код,гляньте: #include <iostream> #include <algorithm> #include <fstream> #include <string> #include <vector> #include <iterator> #include <functional> using namespace std; #include "windows.h" void RussianMessage(char *message){ char rmessage[256]; CharToOem(message,rmessage); cout<<rmessage; } int RussianMenu(){ RussianMessage("\nВведите 1 для добавления новой структуры в файл\n"); RussianMessage("Введите 2 для показа всех структур из файла\n"); RussianMessage("Введите 3 для поиска по фамилиии\n"); RussianMessage("Введите 4 для поиска по имени\n"); RussianMessage("Введите 5 для выхода\n"); int choice; cin>>choice; return choice; } struct Data { Data() : age(0) {} // переменная для возраста int age; // переменная для имени std::string name; // переменная для фамилии std::string surname; //ofstream& operator << (ofstream&, const Data&); // ostream& operator << (ostream&, const Data&); //istream& operator >> (istream&, Data&); }; ostream& operator << (ostream& stream, const Data& d) { RussianMessage("\nИмя: "); stream<<d.name.c_str(); RussianMessage("\nФамилия: "); stream<<d.surname.c_str(); RussianMessage("\nВозраст: "); stream<<d.age; return stream; } ofstream& operator << (ofstream& stream, const Data& d) { // Записываем возраст stream<<d.age<<' '; // Записываем имя stream<<d.name.c_str()<<' '; // Записываем фамилию stream<<d.surname.c_str()<<' '; return stream; } istream& operator >> (istream& stream, Data& d) { stream>>d.age; stream>>d.name; stream>>d.surname; return stream; } struct Pred:binary_function<Data,std::string, bool> { Pred(){} bool operator () (const Data& d, std::string str) const { return ( d.surname == str)? true : false; } }; class Man{ Data data_; public: // конструктор с параметрами Man(char *n,char *s,int a); // конструктор Man(); // функция ввода данных void Put(); // функция показа данных void Show(); // функция сохранения в файл void SaveToFile(); // функция показа содержимого файла void ShowFromFile(); void SearchFileN(); void SearchFileF(); }; // конструктор Man::Man(){} // конструктор с параметрами Man::Man(char *n,char *s,int a){ data_.name.assign(n); data_.surname.assign(s); data_.age = a; } // функция ввода данных void Man::Put(){ std::string temp; RussianMessage("\nВведите имя:\n"); cin>>temp; data_.name.assign(temp); RussianMessage("\nВведите фамилию:\n"); cin>>temp; data_.surname.assign(temp); RussianMessage("\nВведите возраст\n"); cin>>data_.age; } // функция показа данных void Man::Show(){ RussianMessage("\nИмя:\n"); cout<<data_.name; RussianMessage("\nФамилия:\n"); cout<<data_.surname; RussianMessage("\nВозраст:\n"); cout<<data_.age<<"\n"; } // функция сохранения в файл void Man::SaveToFile(){ ofstream file("c:\\men.txt",ios::out|ios::app); if(!file){ RussianMessage("Файл не открылся для чтения !!!"); exit(1); } // file<<data_; } //****************************poisk po familii*********************************************************** void Man::SearchFileF() { std::string surname; fstream file("C://men.txt",ios::in); if(!file) { RussianMessage("Файл не открылся для чтения !!!"); exit(1); } istream_iterator<Data> first(file), last , pos; RussianMessage("Введите фамилию:"); cin>>surname; pos = std::find_if(first,last,bind2nd(Pred(),surname)); if(pos == last) RussianMessage("\nТакого сотрудника нет!\n"); else cout<<*pos; } // ******************************************************************************************************************* //***********************poisk po imeni********************************************************************************* void Man::SearchFileN() { std::string name; fstream file("C://men.txt",ios::in); if(!file) { RussianMessage("Файл не открылся для чтения !!!"); exit(1); } istream_iterator<Data> first(file), last , pos; RussianMessage("Введите имя:"); cin>>name; pos = std::find_if(first,last,bind2nd(Pred(),name)); if(pos == last) RussianMessage("\nТакого сотрудника нет!\n"); else cout<<*pos; } //************************************************************************************************************************* // функция показа содержимого файла void Man::ShowFromFile(){ fstream file("C://men.txt",ios::out); if(!file){ RussianMessage("Файл не открылся для чтения !!!"); exit(1); } istream_iterator<Data> first(file), last; copy(first,last, ostream_iterator<Data>(cout,"\n")); } int main(){ Man a; do{ switch(RussianMenu()){ case 1: // Добавление записи a.Put(); a.SaveToFile(); break; case 2: // Показ всех записей a.ShowFromFile(); break; case 3: a.SearchFileF(); break; case 4: a.SearchFileN(); break; case 5:// Прощание с пользователем RussianMessage("До Свидания\n"); return 0; default: // Неправильный ввод RussianMessage("Неверный Ввод\n"); } }while(1); } |
|
Отправлено: 22:25, 24-05-2006 | #5 |
редкий гость Сообщения: 1696
|
Профиль | Сайт | Отправить PM | Цитировать Отформатируйте код нормально. Мне надоело каждый раз когда я его читаю через indent прогонять Попробуйте всё заново переписать не смотря на старый код (но учитывая его ошибки), ибо то, что есть сейчас просто ужасно со всех точек зрения.
По вопросу: внимательно посмотрите на код SaveToFile, лишних комментариев не заместно? Ещё у вас по имени искать не будет, посмотрите на предикат. |
Отправлено: 22:52, 24-05-2006 | #6 |
Новый участник Сообщения: 15
|
Профиль | Отправить PM | Цитировать что такое предикат
|
Отправлено: 00:39, 25-05-2006 | #7 |
редкий гость Сообщения: 1696
|
Профиль | Сайт | Отправить PM | Цитировать Предикат это третий параметр функции find_if. Понятие пришло из матлогики. В вашем случае это структура с говорящим названием Pred.
Делаем вывод, что код вы таки писали не сами. Ибо люди, которые знают, что такое istream_iterator и find_if, как минимум форматируют исходники лучше. Скорее из чужого слепили, причём разбираться не стали почему и что написано, а сразу спросили на форуме. Судя по предыдущим темам, вы вообще напрягаться не любите. |
------- Отправлено: 01:00, 25-05-2006 | #8 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Не открываются текстовые файлы и изображения и к ним создались файлы с расшир. drweb | leda | Лечение систем от вредоносных программ | 1 | 03-10-2009 01:22 | |
[решено] Не удаляются неизвестные мне файлы fidbox.dat и fidbox.idx. Что это за файлы? | segafos | Лечение систем от вредоносных программ | 31 | 04-06-2009 17:17 | |
CMD/BAT - файлы вида mmdd*.* - для каждой даты нужно создать каталог, скопировать, файлы | milito | Скриптовые языки администрирования Windows | 2 | 24-05-2009 23:32 | |
Доступ - html-файлы грузятся как файлы для скачивания | Dr. MefistO | Microsoft Windows 2000/XP | 1 | 08-03-2009 10:06 | |
Файлы | Surround | Вебмастеру | 4 | 28-03-2003 08:35 |
|