C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Чтение данных из файла в структуру
BasMan
Отправлено: 16.04.2005, 18:26


Ученик-кочегар

Группа: Участник
Сообщений: 5



Здраствуйте уважаемый All, я программер VB, хочу потихоньку переходить на C++, задача такая, существует файл следующего формата

[заголовок]
[запись 1]
[запись 2]
....
[запись n-1]
[запись n]

теперь создаем структуры

struct Header
{
char id[5];
int version;
int records;
}

struct Record
{
char field1[50];
char field2[50];
char field3[100];
}

на VB программа выглядела так, вообще она представляла собой телефонный справочник, причем весьма эффективный как по скорости/так и по удобству, этот фрагмент нужно портировать на С++

type Header
id as string*5
version as long
records as long
end type

type Record
field1 as string*50
field2 as string*50
field3 as string*100
end type

dim Header as Header
dim Record as Record

public sub Load
open "1.dat" for binary as #1
get #1,1,Header
for a=1 to Header.Records
get #1,len(Header)+len(Record)*a,Record
msgbox trim$(Record.Field1)
msgbox trim$(Record.Field2)
msgbox trim$(Record.Field3)
next
close #1
end sub

Если не подмогнете портировать, хотя бы киньте ссылку где копать, мне нужен пример чтения из файла в структуру (переменную пользовательского типа), причем реально рабочий, а не теоретически smile.gif.

icq: 205308913
mail: akossov@taxkost.mgd.kz
Sl@Sh
Отправлено: 16.04.2005, 18:47


Мастер участка

Группа: Участник
Сообщений: 383



Можно использовать класс TStringList. С ним всё просто. Функцией LoadFromFile читаете. Например так :
CODE

TStringList *tmpList = new TStringList;
try
{
    List->Strings[номер строки];
}
__finally
{
    delete tmpList;
}


Отредактировано Sl@Sh — 16/04/2005, 18:47
BasMan
Отправлено: 17.04.2005, 07:13


Ученик-кочегар

Группа: Участник
Сообщений: 5



2Sl@Sh

Пожалуйста, прочти внимательнее мой вопрос, я вообще не работаю с текстовым файлом smile.gif мне нужно прочитать данные в структуры, то есть я работаю с бинарным файлом содержащим записи данных, вот написал код, по идеи должно работать, да как бы не так, вечно на что то ругается.

struct DB_HEADER {
unsigned char id[5];
unsigned short int version;
unsigned short int records;
unsigned char encryption;
unsigned char language;
};

struct DB_RECORD {
char name[50];
char city[50];
char street[50];
char home[5];
char kvart[5];
char phone[10];
char email[50];
};

static struct DB_HEADER db_buf, *db = &db_buf;
static struct DB_RECORD *header;

int adbfile;
if ((adbfile = open(file, 0)) == -1) {
ShowMessage("Ошибка файла не существует.");
exit(1);
}

if ((read( adbfile, (char *)db, sizeof(struct DB_HEADER))) == -1 ) {
};


struct DB_RECORD *h;
String sbuffer;
int rec;

h = malloc(sizeof(h) * db->records);
if (header == NULL) {
ShowMessage("Ошибка выделения памяти");
exit(1);
}
for (rec = 1; rec=db->records; rec++)
{
if((read(adbfile, h, sizeof(h))) == -1) {
exit(1);
}

ShowMessage(h->name);
};

в этом коде вечно что нибуть да не работает, не уже ли такое просто действия что делается на VB за пару минут на С++ отнимает так много сил? такого не может быть! или все таки это так? wink.gif

Отредактировано BasMan — 17/04/2005, 07:35
BasMan
Отправлено: 17.04.2005, 08:25


Ученик-кочегар

Группа: Участник
Сообщений: 5



Ура! все сам расковырял, вот как надо делать

typedef struct {
unsigned char id[5];
unsigned short int version;
unsigned short int records;
unsigned char encryption;
unsigned char language;
} DB_HEADER;

typedef struct {
char name[50];
char city[50];
char street[50];
char home[5];
char kvart[5];
char phone[10];
char email[50];
} DB_RECORD;

if ((adbhandle = open(file, 0)) == -1) {
ShowMessage("Error.");
exit(1);
}
if ((read( adbfile, (unsigned char *) &db_header, sizeof(db_header))) == -1 ) {
};

и все ок!, теперь буду делать все остальное
Sl@Sh
Отправлено: 17.04.2005, 09:00


Мастер участка

Группа: Участник
Сообщений: 383



Извините что не врубился и не успел потом помочь sad.gif . Хорошо что всё хорошо smile.gif

Удачи!

P.S.: Ох вы и рано встаёте smile.gif

Отредактировано Sl@Sh — 17/04/2005, 09:01
Георгий
Отправлено: 17.04.2005, 10:53


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



QUOTE (BasMan @ 17/04/2005, 08:25)
if ((read( adbfile, (unsigned char *) &db_header, sizeof(db_header))) == -1 ) {};

всё правильно, но только преобразование типа ( unsigned char* ) лишнее
BasMan
Отправлено: 17.04.2005, 17:01


Ученик-кочегар

Группа: Участник
Сообщений: 5



2Sl@Sh
Да ничего страшного, будет еще мнооого вопросов (я так думаю).

2Георгий
Ок, при к сведению.
BasMan
Отправлено: 17.04.2005, 17:05


Ученик-кочегар

Группа: Участник
Сообщений: 5



2Sl@Sh

>>P.S.: Ох вы и рано встаёте

smile.gif, ничего подобного, просто это разница во времени, когда я писал сообщение, на часах было 9:13


Всем спасибо!

Вернуться в Вопросы программирования в C++Builder