
24.02.2008, 22:13
|
|
Постоянный
Регистрация: 12.04.2007
Сообщений: 413
Провел на форуме: 3578578
Репутация:
275
|
|
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..
|
|
|