Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.06.2010, 13:13   #1
Subtile
 
Аватар для Subtile
 
Регистрация: 19.05.2009
Сообщений: 6
Вопрос Поиск и вывод структуры из файла (С++)

Здравствуйте.
Стоит такая задача:
Нужно обеспечить ввод данных в структуру пользователем, сохранение этих данных в файл. Далее нужно организовать поиск и вывод структуры из файла по значению одного из полей.
Код у меня получился такой:
Код:
#include <fstream.h>
#include <string.h>
#include <conio.h>
#include <iomanip.h>
#include <stdlib.h>

#define NSIZE 20

struct BOOK 
{
	char name[NSIZE];
	char author[NSIZE];
	char pub[NSIZE];
	int year;
        int pages;
	int chapter;
	char disc[NSIZE];
};

// Functions' prototypes
void creation();
void view();
void choose();
void header();

// Keyboard input
istream &operator >> (istream &in, BOOK &x)
{
cout << "\nBook name: ";
in.seekg(0, ios::end);
in.get(x.name, NSIZE-1, '\n');
cout << "\nAuthor:";
in.seekg(0, ios::end);
in.get(x.author, NSIZE-1, '\n');
cout << "\nPublishing: ";
in.seekg(0, ios::end);
in >> x.pub,NSIZE-1,'\n';
cout << "\nPublishing year: ";
in.seekg(0, ios::end);
in >> x.year;
cout << "\nNumber of pages: ";
in.seekg(0, ios::end);
in >> x.pages;
cout<<"\nNumber of chapters: ";
in.seekg(0,ios::end);
in >> x.chapter;
cout<<"\nDisciplina: ";
in.seekg(0,ios::end);
in >> x.disc,NSIZE-1,'\n';
return in;
}

// Display output
ostream &operator << (ostream &out, BOOK x)
{
	out.setf(ios::left);	//Align left flag
	out << "|" << setw(NSIZE) << x.name << "|" << setw(NSIZE) << x.author << "|"
	    << setw(NSIZE) << x.pub << "|" << setw(5) << x.year << "|" << setw(5) << x.pages << "|"
	    << setw(5) << x.chapter << "|" << setw(NSIZE) << x.disc << "|\n";
        return out;
}

// Input from file
ifstream &operator >> (ifstream &in, BOOK &x)
{
	in.getline(x.name, NSIZE, '\n');
	in.getline(x.author, NSIZE, '\n');
	in.getline(x.pub, NSIZE, '\n');
	in >> x.year;
        in >> x.pages;
	in >> x.chapter;
	in.getline(x.disc, NSIZE, '\n');
        return in;
}

// Write to file operation
ofstream & operator << (ofstream &out, BOOK &x)
{
	out << x.name << endl
	    << x.author << endl
	    << x.pub << endl
	    << x.year << endl
            << x.pages << endl
	    << x.chapter << endl
	    << x.disc << endl;
        return out;
}

void main(void)
{
	char c;
	while(1)
	{
		cout << endl << "1. Create file";
		cout << endl << "2. View content";
		cout << endl << "3. List by theme";
		cout << endl << "4. Exit";
		cout << endl << "Your choise: ";
		cin.seekg(0, ios::end);
		c = cin.get();
		switch(c)
		{
			case '1':
				creation();
				break;
			case '2':
				view();
                                break;
			case '3':
				choose();        
				break;
			case '4':
				return;

			default:
                        	cout << "Choose number from 1 to 4" << endl;
                }
        }
}

// Header output
void header()
{
	cout << "-----------------------------------------------------------------------------------------------\n";
	cout << "|       Title       |        Author      |     Publisher     |Year|#pag|#Ch |    Disciplina   |\n";
	cout << "|----------------------------------------------------------------------------------------------\n";
}

// Creation of file
void creation()
{
	char c;
	ofstream ff;			// Stream for writing to file
	BOOK s;
	ff.open("books.txt");	        // Open file and tie it to ff stream

	if (!ff)
	{
		cerr << "Error while opening file to write\n";
                exit(1);
	}

	do
	{
		cin >> s;
		ff << s;
		cout << "\nContinue input? (Y/N)";
		cin.seekg(0L, ios::end);
                c = cin.get();
	}
	while (c == 'y' || c == 'Y');
        ff.close();
}

// Defining function that will output all information
void view()
{
	ifstream finp;
	BOOK s;
	finp.open("books.txt", ios::in);

	if(!finp)
	{
		cerr << "Error while opening file\n";
                exit(1);
	}

	cout << "\nList of elements in file\n";
	header();

	while(finp)
	{
		finp >> s;
		if (strlen(s.name) <= 0)
			break;
                cout << s;
	}
	finp.close();
        cout << "\n\n";
}

// Definig condition output function
void choose()
{
	char theme[NSIZE];
	ifstream fi;
	BOOK b;
	fi.open("books.txt", ios::in);

	if(!fi)
	{
		cerr << "Error while opening file\n";
		exit(1);
	}

	cout << "Enter Disciplina: ";
	cin.seekg(0, ios:: end);
	cin.get(theme, NSIZE-1, '\n');
	cout << "List of authors:\n";

	while(!fi.eof())
	{
		fi >> b;
		if(strlen(b.name) <= 0)
                	break;
		if(strcmp(b.disc, theme) == 0)
                	cout << b;
	}
	fi.close();
}
Делалось всё по рекомендациям в методичке. Данный код не компилируется в Visual C++, компилировал в Borland С++ 3.1. Поэтому нормального дебаггинга я сделать не смог.

Проблема: Ввод работает, запись в файл тоже. Вывод всех данных из файла также работает. Но вывод с определённым параметром не работает. Никакие записи не выводятся.

Подскажите пожалуйста, в чём может быть проблема.
Subtile вне форума Ответить с цитированием
Старый 29.06.2010, 13:26   #2
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

мне вот например не интересно читать всё это. Какие ошибки выдает компилятор хоть покажи, мы не телепаты, хотя если подключить telepat.h, то может и станем =))) А еще лучше выдели ту часть кода, где ты подозреваешь ошибку. Выводи отладочную информацию типа "строка x выполнена успешно" . Пора бы самому учиться ошибки исправлять.
NiCola999 вне форума Ответить с цитированием
Старый 29.06.2010, 14:00   #3
Subtile
 
Аватар для Subtile
 
Регистрация: 19.05.2009
Сообщений: 6
По умолчанию

Компилятор ошибок не выдаёт. Просто после ввода условия (дисциплины), не выводятся никакие данные, даже если совпадения присутствуют.

На счёт исправления ошибок. Совет конечно хороший, главное оригинальный. Но проблема как раз в том, что я не могу найти ошибку. И, как написал выше, не знаю где можно провести отладку этого кода, т.к. Visual C++, с которым я работал, его не принимает.

Последний раз редактировалось Subtile; 29.06.2010 в 14:04.
Subtile вне форума Ответить с цитированием
Старый 29.06.2010, 17:45   #4
RoS
Форумчанин
 
Аватар для RoS
 
Регистрация: 13.12.2009
Сообщений: 272
По умолчанию

КОД У ТЕБЯ ПОЛУЧИЛОСЬ ВЗЯТЬ У ОДНОГРУППНИКА ТАКОЙ!

ппц надо самому что-нибудь делать, если бы ты это сам написал, то ты бы понял в чем ошибка!
Если я помог вам - порадуйте меня, нажмите на весы слева
RoS вне форума Ответить с цитированием
Старый 29.06.2010, 17:59   #5
Subtile
 
Аватар для Subtile
 
Регистрация: 19.05.2009
Сообщений: 6
По умолчанию

RoS
К сожалению порадовать тебя и нажать на весы не получится.
Код я писал сам. Понимаю, что значит каждый элемент. По крайней мере мне так кажется. Могу и ошибаться. Но это я смогу понять только если кто-то, возможно и ты, скажет в чём ошибка.

Прошу понять, я не люблю обращаться за помощью. Тем более по учёбе. На эту проблему я потратил достаточно много времени, чтобы понять, что моих знаний тут не хватит. Я подумал, что programmersforum это место где есть знающие люди и, т.к. есть раздел помощи студенту, эти люди готовы помочь. Но, похоже тут готовы только безосновательно глумиться над теми, у кого что-то не получилось.
Subtile вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вывод русского текста из структуры Zimik C++ Builder 5 23.05.2010 17:24
Поиск и вывод строк из файла samCS PHP 8 10.03.2010 04:07
Поиск в файле, вывод из файла online_maniac Помощь студентам 2 01.11.2009 09:32
Вывод структуры в Си Sergo(1) Помощь студентам 3 16.04.2009 09:31
поиск по наванию файла и вывод на экран Karinka Общие вопросы Delphi 12 16.03.2009 11:52