Вот пишу лабораторку и мне необходимо записать структуру в файл, потом прочесть её и произвести поиск по отдельным перменным. погите с записью (чтением) структуры в (из) файла
write(дескриптор_файла, &структура, sizeof структура) read(дескриптор_файла, &структура, sizeof структура) вроде так.
CFile f; CFileException e; struct mt { .... .... } mtu; f.write((char *)&mtu,sizeof(mt)); f.read((char *)&mtu,sizeof(mt)); Edited: Пива было много.... поэтому чипатал левой ногом.
давайте щас еще понтоваться кто как умееть писать в файл +) пусть автор уточнит как он производит запись. но абстрактно это можно выразить так, как сказал zythar это раз.. два: Delimiter, как ты собрался брать АДРЕС СТРУКТУРЫ? Поясни-ка поподробнее..
я сам толком не знаю как я произвожу запись вобщем ситуация следующяя: У меня есть структура Code: struct MYSTRUCTURE { char city[20]; char otp[5]; int number; char time[5]; int mest; }; Мне нада ввести с терминала данные в елементы структуры и записать всё это безобразие в файл, таким образом чтоб я мог потом его открыть и произвести поиск по елементам city и otp, запрос для поиска тоже должен вводится с клавиатуры. Количество записей в файле должно быть произвольное. И желательно это всё запихнуть в одну программу т.е. сначала вводим эти записи потом какойнибудь стоп символ вводится, данные записываются, потом читаются и работа с поиском.
ну хз.. структуру объявил, потом объяви переменную типа структуры: struct MYSTRUCTURE foo; присвой элементам структуры значения сам, в исходном файле, потом открой файл, и записивай в него или так как я сказал или как delimiter. если все хорошо пойдет то тогда уже вводи значения елементов структуры из терминала.
хм и что это получится если записей будет много? Вот так получилось, но не знаю можно ли так: Code: #include <iostream.h> #include <string.h> #include <stdio.h> struct MYSTRUCTURE { char city[20]; char otp[5]; int number; char r[5]; int mest; }; main() { MYSTRUCTURE MyStructure; strcpy(MyStructure.city, "Moscov" ); strcpy(MyStructure.otp, "10:25"); strcpy(MyStructure.r, "16:25"); MyStructure.mest = 20; MyStructure.number =1112; freopen("aeroflot.txt", "rt", stdout); cout << "|"; cout << MyStructure.number; cout << "|"; cout << MyStructure.city; cout << "|"; cout << MyStructure.otp; cout << "|"; cout << MyStructure.r; cout << "|"; cout << MyStructure.mest; cout << "|" << endl; return 0; } П.С. чуть упростил задачю т.к. меня интересует пока только запись в файл ввод переменных через присваивание, и копирование.
все норм получиться, каждый элемент с новой строки, и так любое кол-во. Загружать также. Все элементарно
Code: #include <iostream.h> #include <fstream.h> struct MYSTRUCT { char city[20]; char otp[5]; int number; char r[5]; int mest; }; int main(void){ int i; struct MYSTRUCT s[200]; ofstream mystream_out("aeroflot.txt", ios::in|ios::out); if (!mystream_out) { cout << "Cannot open file.\n"; return 1; } else{ for(i=1; i<=2; i++){ cout<< "\nZapus" <<("%2.d",i); cout<< ("\nCity"); cin >> s[i].city; } mystream_out.write((char*)s, sizeof(s)); mystream_out<< &s <<endl; mystream_out.close(); } return 0; } чуствую что гдето ошибся ибо открыв файл получаю вместо двух слов много сиволов разных. Это так и должно быть или я всётаки ошибся?
а почему у тебя массив структур то? делай одну структуру а не массив. потом присваивай значения элементам структуры, потом открывай файл и в него пиши. что ты там написал я не разобрался. лучше используй не с++ а си. в си все намноге проще и яснее
Code: #include <stdio.h> struct MYSTRUCT { char city[20]; char otp[5]; int number; char r[5]; int mest; }; int main(void) { int KolEl; ///// ....... определяемся c кол-вом элементов MYSTRUCT *dan= new MYSTRUCT[KolEl]; /* тут ввод данных .................. */ //сохраняем FILE *fw; fw = fopen("save.txt", "wb"); for(int i=0; i<KolEl; i++) fprintf(fw, "%s\n%s\n%d\n%s\n%d\n", dan[i].city, dan[i].otp, dan[i].number, dan[i].r, dan[i].mest,); fclose(fw); return 0; }
ph0en1x Держи рабочий вариант: Code: #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, для данной конкретной задачи не нужно использовать массив структур, достаточно одной стуктуры. При написании этого кода я упустил этот момент. Оставляю первоначальный вариант, так как он, мне кажется, больше соответствует названию темы.