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
Если не подмогнете портировать, хотя бы киньте ссылку где копать, мне нужен пример чтения из файла в структуру (переменную пользовательского типа), причем реально рабочий, а не теоретически .
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
Пожалуйста, прочти внимательнее мой вопрос, я вообще не работаю с текстовым файлом мне нужно прочитать данные в структуры, то есть я работаю с бинарным файлом содержащим записи данных, вот написал код, по идеи должно работать, да как бы не так, вечно на что то ругается.
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 за пару минут на С++ отнимает так много сил? такого не может быть! или все таки это так?
Отредактировано 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
|
Извините что не врубился и не успел потом помочь . Хорошо что всё хорошо
Удачи!
P.S.: Ох вы и рано встаёте
Отредактировано 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.: Ох вы и рано встаёте
, ничего подобного, просто это разница во времени, когда я писал сообщение, на часах было 9:13
Всем спасибо! |
|