Показать сообщение отдельно

  #3  
Старый 24.02.2008, 22:13
Forcer
Постоянный
Регистрация: 12.04.2007
Сообщений: 413
Провел на форуме:
3578578

Репутация: 275
Отправить сообщение для Forcer с помощью ICQ
По умолчанию

ph0en1x
Держи рабочий вариант:

Код:
#include <iostream>
#include <fstream>
using namespace std;

struct MYSTRUCT {
	char city[20];
	char otp[5];
	int number;
	char r[5];
	int mest;
};

void setStructVals(struct MYSTRUCT &);
void svStrToFile(const struct MYSTRUCT &, fstream &);
void prtStr(const struct MYSTRUCT &);

int main()
{
	const char ifile[] = "aeroflot.txt";
	struct MYSTRUCT* myptr = 0;
	int size = 0;

	// узнаём у пользователя, сколько он хочет ввести структур
	cout << "Number of structurs : ";
	cin >> size;

	//  выделяем память и проверяем, выделилась ли она
	myptr = new struct MYSTRUCT[size];

	if( myptr == 0 ) {
		cerr << "Not enougth memory" << endl;
		return 1;
	}

	// открываем файл, делаем проверку открытия
	fstream file(ifile, ios::binary | ios::in | ios::out | ios::trunc);
	
	if( file.fail() ) {
		cerr << "Cant open file" << endl;
		return 1;
	}

	// предоставляем пользователю возможность ввести значения для структур, сразу же сохраняя в файл
	for(int i=0; i < size; ++i) {
		cout << "\tNew struct : " << endl;
		setStructVals(myptr[i]);
		svStrToFile(myptr[i], file);
	}

	// освобождаем память занятую структурами
	// теперь структуры мы сможем получить только из файла
	delete [] myptr;

	// запрашиваем у пользователя данные для поиска
	char city[20];
	char otp[5];

	cout << "\n\tFind struct:\nInput parametrs for struct : " << endl;
	cout << "\ncity : ";
	cin >> city;
	cout << "otp : ";
	cin >> otp;

	struct MYSTRUCT tmp;

	// осуществляем поиск по введённым значениям
	for(int i=0; i < size; ++i) {
		file.seekg(i * sizeof(tmp));
		file.read((char*)&tmp, sizeof(tmp));

		if( ( strcmp(tmp.city, city) && strcmp(tmp.otp, otp) ) == 0 ) {
			cout << "Struct : " << endl;
			prtStr(tmp);
			// break;  // можно завершить поиск, либо искать дальше
		}
	}

	cout << "\tsearch is ended" << endl;

	// завершаем работу
	file.close();

	return 0;
}

void setStructVals(struct MYSTRUCT &str) {
	cout << "city : ";
	cin >> str.city;   // предполагается, что нет разделителей в названии города
	cout << "otp : ";
	cin >> str.otp;
	cout << "number : ";
	cin >> str.number;
	cout << "r : " ;
	cin >> str.r;
	cout << "mest : ";
	cin >> str.mest;
}

void svStrToFile(const struct MYSTRUCT &str, fstream &file) {
	file.write((char*)&str, sizeof(str));
}

void prtStr(const struct MYSTRUCT &str) {
	cout << "city : " << str.city << endl;
	cout << "otp : " << str.otp << endl;
	cout << "number : " << str.number << endl;
	cout << "r : " << str.r << endl;
	cout << "mest : " << str.mest << endl;
}
Замечание:
Как правильно заметил zythar, для данной конкретной задачи не нужно использовать массив структур, достаточно одной стуктуры. При написании этого кода я упустил этот момент. Оставляю первоначальный вариант, так как он, мне кажется, больше соответствует названию темы.

Последний раз редактировалось Forcer; 25.02.2008 в 03:36..
 
Ответить с цитированием