Не работает цикл с классовым типом данных

  • Автор темы ilya1989
  • Дата начала
I

ilya1989

#1
Уважаемые господа-программисты!
Не могу уже который день разобраться с 2-мя проблемами:
1.В данной программе первая функция sozdanie() организованна с циклом while при вводе данных с клавиатуры.В данном случае,вводится информация по книгам(библиотека).После(окончания ввода данных
об одной книге в цикле while задано,что пока пользователь нажимает 'Д','д','Y','y'.ввод данных с клавиатуры не прекращается.ПРОГРАММУ ПИСАЛ ПО МЕТОДИЧКЕ ПРЕПОДАВАТЕЛЯ,Т.К. ПРЕПОД УКАЗАЛ,ЧТО ОТКЛОНЕНИЙ ПРИ НАПИСАНИИ ПРОГРАММЫ ОТ ЕЁ РАБОТЫ БЫТЬ НЕ ДОЛЖНО!
Но,при нажатии вышеуказанных символов программа почему-то возвращает меня в main().
2.Функция prosmotr() так же тупит!Она почему-то выдает при выводе не 5 введенных данных,а 6

Вот код программы
C++:
#include <iostream.h>
#include <fstream.h>
#include <conio.h>
#include <iomanip.h>
#include <io.h>
#define A 2
class Book
{
public:
char name[15];
char FIO[20];
int page;
char publishing_office[15];
char publication_date[12];
};
void sozdanie();
void tabl();
void prosmotr();
void poisk();


//1.ввод с клавиатуры
istream &operator>>(istream &vvod,Book &book)
{

cout<<"\nВведите название книги :";
vvod.ignore();
vvod.get(book.name,14,'\n');
cout<<"\nВведите ФИО Автора :";
vvod.ignore();
vvod.get(book.FIO,19,'\n');
cout<<"\nВведите колличество страниц в книге :";
cin.ignore();
cin>>book.page;
cout<<"\nВведите название издательства книги :";
vvod.ignore();
vvod.get(book.publishing_office,14,'\n');
cout<<"\nВведите дату публикации книги(год) :";
vvod.ignore();
vvod.get(book.publication_date,11,'\n');
return vvod;
}

//2.Вывод на дисплей
ostream &operator<<(ostream &vivod,Book &book)
{
vivod.setf(ios::left);
vivod<<setw(15)<<book.name<<"|"<<setw(20)<<book.FIO<<"|"<<setw(5)
<<book.page<<"|"<<setw(15)<<book.publishing_office<<"|"<<setw(12)<<book.publication_date<<endl;
return vivod;
}

//3.Чтение из файла
ifstream &operator>>(ifstream &read,Book &book)
{
read.getline(book.name,15,'\n');
read.getline(book.FIO,20,'\n');
read>>book.page;
read.seekg(2L,ios::cur);
read.getline(book.publishing_office,15,'\n');
read.getline(book.publication_date,12,'\n');
return read;
}

//4.Запись в файл
ofstream &operator<<(ofstream &write,Book &book)
{
write<<book.name<<endl;
write<<book.FIO<<endl;
write<<book.page<<endl;
write<<book.publishing_office<<endl;
write<<book.publication_date<<endl;
return write;
}

void tabl()
{
cout<<"------------------------------------------------------------------------\n";
cout<<"|	 Название |		 ФИО		| Кол.| Наименование |	Дата |\n";
cout<<"|	 книги  |		АВТОРА	 | стр.| издательства | публикации|\n";
cout<<"------------------------------------------------------------------------\n";
}


//создание файла
void sozdanie()
{
char x;
ofstream new_f("Book.txt",ios::app);
Book a;
if(!new_f)
{
cerr<<"Do not create of file Book.txt"<<endl;
return;
}
do
{
cin>>a;
new_f<<a;
cout<<"Продолжить ввод? (Д/Н,Y/N)";
cin.get(x);
}
while(x=='Y'||x=='y'||x=='Д'||x=='д');
new_f.close();
getch();
}

//вывод всей информации на дисплей
void prosmotr()
{
ifstream out("Book.txt",ios::in);
Book b;
if(!out)
{
cerr<<"Не удалось открыть файл Book.txt для чтения!"<<endl;
return;
}
cout<<"Вывод всей информации из файла \n";
tabl();
while(out)
{
out>>b;
cout<<b;
}
out.close();
cout<<"\n|--------------|------------------|----------|---------------|----------|"<<endl;
getch();
}

//поиск данных по условиям
void poisk()
{
char izdatelstvo[15];
char date[12];
int kol=0;
ifstream poisk("Book.txt",ios::in);
Book s;
if(!poisk)
{
cerr<<"Ошибка открытия файла Book.txt для чтения ";
return;
}
cin.ignore();
cout<<"Введите наименование издательства :";
cin.getline(izdatelstvo,14,'\n');
cout<<"Введите год издания книги :";
cin.getline(date,11,'\n');
cout<<"Результаты поиска";
tabl();
while(!poisk.eof())
{
poisk>>s;
if(!strcmp(izdatelstvo,s.publishing_office)||(!strcmp(date,s.publication_date)))
{
kol++;
cout<<s;
}
}
if(kol==0)
{
cout<<"Zapisey ne naydeno!";
}
getch();
poisk.close();

cout<<"|--------------|------------------|----------|---------------|----------|"<<endl;
}

void main(void) 
{ 
char c; 
while (1)
{ 
cout << endl << "1. Создание файла"; 
cout << endl << "2. Просмотр содержимого"; 
cout << endl << "3. Вывод информации о книге(ах)";
cout << endl << "4. Выход";
cout << endl << "Ваш выбор -> "; 
cin.get(c);
switch(c) 
{ 
case '1': 
sozdanie();
break; 

case '2': 
prosmotr(); 
break; 

case '3': 
poisk(); 
break; 

case '4':
return; 
default: 
cout << "Вводите только цифры от 1 до 4" << endl; 
} 
} 
}

вот скриншот первой функции
1.jpg
в данном случае я ввел ради проверки все "1"
после нажатия 'Y' меня вернуло в главное меню,а ввод-то должен продолжаться!

вот второй скриншот вывода всех данных из файла,но вывод так же не работает,поскольку откуда-то взялась при выводе лишняя 1!

2.jpg

Заранее очень благодарен всем,кто откликнется!
 

Вложения

  • 127.6 КБ Просмотры: 48
  • 111.4 КБ Просмотры: 44
I

ilya1989

#3
Вопросик:а чем отличается cin.get(x) от cin >> x? просто в методичке препода было указанно именно так,а чем отличаются эти два действия,не совсем понимаю...
 

lazybiz

Well-known member
03.11.2010
1 339
0
#6
Может ты все же напишешь русский текст транслитом! Мне, если честно, лень гадать что у тебя на изображениях...
 
I

ilya1989

#7
Может ты все же напишешь русский текст транслитом! Мне, если честно, лень гадать что у тебя на изображениях...
Запросто
cout<<"------------------------------------------------------------------------\n";
cout<<"| Название | ФИО | Кол.| Наименование | Дата |\n";
cout<<"| книги | АВТОРА | стр.| издательства | публикации|\n";
(name) (FIO) (page) (publishing_office) (publication_date)
cout<<"------------------------------------------------------------------------\n";

Так нормально будет?
 

lazybiz

Well-known member
03.11.2010
1 339
0
#8
Нет, не нормально. Просто переведи весь русский текст программы на транслит.