PDA

Просмотр полной версии : Структуры и работа с ними


ph0en1x
23.02.2008, 21:51
Вот пишу лабораторку и мне необходимо записать структуру в файл, потом прочесть её и произвести поиск по отдельным перменным.
погите с записью (чтением) структуры в (из) файла

zythar
23.02.2008, 21:54
write(дескриптор_файла, &структура, sizeof структура)
read(дескриптор_файла, &структура, sizeof структура)

вроде так.

Delimiter
24.02.2008, 15:52
write(дескриптор_файла, &структура, sizeof структура)
read(дескриптор_файла, &структура, sizeof структура)

вроде так.

CFile f;
CFileException e;

struct mt
{
....
....
} mtu;

f.write((char *)&mtu,sizeof(mt));

f.read((char *)&mtu,sizeof(mt));

Edited: Пива было много.... поэтому чипатал левой ногом.

_Great_
24.02.2008, 15:56
давайте щас еще понтоваться кто как умееть писать в файл +)
пусть автор уточнит как он производит запись. но абстрактно это можно выразить так, как сказал zythar

это раз.. два: Delimiter, как ты собрался брать АДРЕС СТРУКТУРЫ? Поясни-ка поподробнее..

ph0en1x
24.02.2008, 16:26
давайте щас еще понтоваться кто как умееть писать в файл +)
пусть автор уточнит как он производит запись. но абстрактно это можно выразить так, как сказал zythar

это раз.. два: Delimiter, как ты собрался брать АДРЕС СТРУКТУРЫ? Поясни-ка поподробнее..
я сам толком не знаю как я произвожу запись :confused:
вобщем ситуация следующяя:
У меня есть структура
struct MYSTRUCTURE {
char city[20];
char otp[5];
int number;
char time[5];
int mest;
};
Мне нада ввести с терминала данные в елементы структуры и записать всё это безобразие в файл, таким образом чтоб я мог потом его
открыть и произвести поиск по елементам city и otp, запрос для поиска тоже должен вводится с клавиатуры.
Количество записей в файле должно быть произвольное. И желательно это всё запихнуть в одну программу т.е. сначала вводим эти записи потом какойнибудь стоп символ вводится, данные записываются, потом читаются и работа с поиском.

zythar
24.02.2008, 17:33
ну хз.. структуру объявил, потом объяви переменную типа структуры:
struct MYSTRUCTURE foo;

присвой элементам структуры значения сам, в исходном файле, потом открой файл, и записивай в него или так как я сказал или как delimiter.
если все хорошо пойдет то тогда уже вводи значения елементов структуры из терминала.

nc.STRIEM
24.02.2008, 18:31
сохраняй каждый элемент структуры с новой строки и все...

ph0en1x
24.02.2008, 18:46
сохраняй каждый элемент структуры с новой строки и все...
хм и что это получится если записей будет много?

Вот так получилось, но не знаю можно ли так:
#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;
}
П.С. чуть упростил задачю т.к. меня интересует пока только запись в файл ввод переменных через присваивание, и копирование.

nc.STRIEM
24.02.2008, 19:12
все норм получиться, каждый элемент с новой строки, и так любое кол-во. Загружать также. Все элементарно

ph0en1x
24.02.2008, 19:55
#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;
}
чуствую что гдето ошибся ибо открыв файл получаю вместо двух слов много сиволов разных.
Это так и должно быть или я всётаки ошибся?

zythar
24.02.2008, 20:18
а почему у тебя массив структур то?
делай одну структуру а не массив. потом присваивай значения элементам структуры, потом открывай файл и в него пиши. что ты там написал я не разобрался. лучше используй не с++ а си. в си все намноге проще и яснее

nc.STRIEM
24.02.2008, 21:29
#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;
}

Forcer
24.02.2008, 22:13
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, для данной конкретной задачи не нужно использовать массив структур, достаточно одной стуктуры. При написании этого кода я упустил этот момент. Оставляю первоначальный вариант, так как он, мне кажется, больше соответствует названию темы.