pcstupid
Зарегистрирован: 13.02.2004 Сообщения: 61
|
Добавлено: Пт Мар 04 2005 11:06 Заголовок сообщения: Второй вопрос по Си |
|
|
Делаю прогу которая должна доставать из dbf-файла структуру (список и типы полей и т.п.) и вываливать всё в текстовый файл. Начал так:
#include <io.h>
#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <iostream.h>
void main()
{
int dbf;
struct Head {
char ctrlch;
char mDate[3];
long Recs[4];
int headSize;
int fieldSize;
int Reserv1;
char TransFlag;
char cp;
char multyUser[12];
char isMDX;
char Lang;
int Reserv2;
};
struct Field {
char name[11];
char fType;
char reserv1[4];
char size;
char num;
char reserv2[2];
char wsID;
char reserv3[10];
char isMDX;
};
Head = malloc(32);
Field = malloc(32);
dbf = open("ALG.DBF", O_RDONLY);
read(dbf, Head, 32);
read(dbf, Field, 32);
fprintf (stderr, "%c\n", Field[11]);
close(dbf);
}
И ни фига не получилось. Толкните, где копать? Стоит ли связываться с классами? |
|
критикан
Зарегистрирован: 18.02.2005 Сообщения: 247
|
Добавлено: Пт Мар 04 2005 11:57 Заголовок сообщения: Вечно всё приходится самому делать |
|
|
dbflib.h
Код: | #ifndef DBFLIB
#define DBFLIB
#include <stdio.h>
#define DBF_MODEREAD 0
#define DBF_MODERDWR 1
#define DBF_ErrOk 0
#define DBF_ErrUnknown 1
#define DBF_ErrFile 2
#define DBF_ErrMemo 3
#define DBF_ErrDBF 4
#define DBF_ErrBadRecord 5
#define DBF_ErrBadRecNo 6
struct DBF_HEADER_TABLE {
char file_type;
char last_updated [3];
int records_num;
short int header_size;
short int record_size;
int reserv [4];
int sym_code_page;
}; // struct DBF_HEADER_TABLE
struct DBF_HEADER_FIELD {
char name [11];
char type;
int start;
unsigned char len;
unsigned char dec;
char reserv [14];
}; // struct DBF_HEADER_FIELD
struct DBF_STATUS {
DBF_HEADER_TABLE *table;
DBF_HEADER_FIELD *field;
int fields_num;
int record_no;
char* buf;
}; // struct DBF_STATUS
class DBF: public DBF_STATUS {
private:
FILE* fil;
public:
DBF (char*, int); // открывает DBF-файл, возвращает ссылку на него
// арг1 -- имя файла
// арг2 -- режим открытия: DBF_MODEREAD | DBF_MODERDWR
~DBF ();
int DBF_SEEK (int); // устанавливает указатель на запись № арг
int DBF_READ (void); // читает следующую запись
int DBF_WRITE (void); // пишет следующую запись
int DBF_EOF (void); // возвращает состояние конца файла
void DBF_FIELD_PRINTF (int, FILE* = stdout);
}; // class DBF: public DBF_STATUS
int DBF_ERROR_NO (void);
char* DBF_ERROR_MSG (void);
void DBF_STRUCT_PRINTF (DBF&, FILE* = stdout);
#endif /* !DBFLIB */
|
--------------
dbflib.cpp
Код: | #include "dbflib.h"
int DBF_ErrNo;
char* DBF_ErrMsg [] = {
"No error",
"Unknown error",
"File error",
"Heap memory error",
"Table structure error"
}; // char* DBF_ErrMsg []
int DBF_ERROR_NO (void) { return DBF_ErrNo; }
char* DBF_ERROR_MSG (void) { return DBF_ErrMsg [DBF_ErrNo]; }
void DBF_STRUCT_PRINTF (DBF& dbf, FILE* stream = stdout) {
fprintf (stream, "Type 0x%0.2x\n", dbf.table->file_type);
fprintf (stream, "Last updated %d/%d/%d\n",
(dbf.table->last_updated [0] < 50 ? 2000 : 1900) + dbf.table->last_updated [0],
dbf.table->last_updated [1],
dbf.table->last_updated [2]);
fprintf (stream, "Records number %d\n", dbf.table->records_num);
fprintf (stream, "Header size %d\n", dbf.table->header_size);
fprintf (stream, "Record size %d\n", dbf.table->record_size);
fprintf (stream, "Code page %d\n", dbf.table->sym_code_page);
fprintf (stream, "Fields: number %d\n", dbf.fields_num);
for (int i = 0; i < dbf.fields_num; i++)
fprintf (stream, "\t%d. %d\t%s\t%c\t%d\t%d\n",
i,
dbf.field [i].start,
dbf.field [i].name,
dbf.field [i].type,
dbf.field [i].len,
dbf.field [i].dec
);
} // void DBF_STRUCT_PRINTF (DBF& dbf, FILE* stream = stdout)
DBF::~DBF () {
if (table != NULL) delete table;
if (field != NULL) delete [] field;
if (buf != NULL) delete [] buf;
fclose (fil);
if (ferror (fil) && (DBF_ErrNo == DBF_ErrOk)) DBF_ErrNo = DBF_ErrFile;
} // DBF::~DBF ()
DBF::DBF (char* DBFName, int DBFMode) {
int res_err = DBF_ErrOk, remain;
table = NULL;
field = NULL;
buf = NULL;
if (res_err == DBF_ErrOk) if (res_err = (fil = fopen (DBFName, DBFMode ? "r+" : "r")) == NULL) DBF_ErrNo = DBF_ErrFile;
if (res_err == DBF_ErrOk) if (res_err = (table = new DBF_HEADER_TABLE) == NULL) DBF_ErrNo = DBF_ErrMemo;
if (res_err == DBF_ErrOk)
if (res_err = (fread ((void*) table, sizeof (DBF_HEADER_TABLE), 1, fil) == 0))
DBF_ErrNo = ferror (fil) ? DBF_ErrFile : DBF_ErrDBF;
if (res_err == DBF_ErrOk)
if (res_err = ((char*) field = new char [remain = table->header_size - sizeof (DBF_HEADER_TABLE)]) == NULL)
DBF_ErrNo = DBF_ErrMemo;
if (res_err == DBF_ErrOk)
if (res_err = (fread ((void*) field, remain, 1, fil) == 0))
DBF_ErrNo = ferror (fil) ? DBF_ErrFile : DBF_ErrDBF;
if (res_err == DBF_ErrOk) {
for (fields_num = 0; remain >= sizeof (DBF_HEADER_FIELD); remain -= sizeof (DBF_HEADER_FIELD))
fields_num++;
if (res_err = (buf = new char [table->record_size]) == NULL)
DBF_ErrNo = DBF_ErrMemo;
} // if (res_err == DBF_ErrOk)
if (res_err != DBF_ErrOk) {
if (table != NULL) delete table;
if (field != NULL) delete [] field;
if (buf != NULL) delete [] buf;
fil = NULL;
} // if (res_err != DBF_ErrOk)
return;
} // DBF::DBF (char* DBFName, int DBFMode)
int DBF::DBF_READ (void) { // читает следующую запись
int read_no;
if (!(read_no = fread ((void*) buf, table->record_size, 1, fil)))
DBF_ErrNo = ferror (fil) ? DBF_ErrFile : DBF_ErrDBF;
return read_no;
} // int DBF::DBF_READ (void)
int DBF::DBF_WRITE (void) { // пишет следующую запись
int read_no;
if (!(read_no = fwrite ((void*) buf, table->record_size, 1, fil)))
DBF_ErrNo = ferror (fil) ? DBF_ErrFile : DBF_ErrDBF;
return read_no;
} // int DBF::DBF_WRITE (void)
int DBF::DBF_SEEK (int rec_no) { // устанавливает указатель на запись № арг
int char_no;
if (rec_no < table->records_num) {
if (fseek (fil, table->header_size + table->record_size * rec_no, SEEK_SET) != 0)
DBF_ErrNo = DBF_ErrFile;
} else // if (rec_no < records_num)
DBF_ErrNo = DBF_ErrBadRecNo;
return rec_no;
} // int DBF::DBF_SEEK (int rec_no)
int DBF::DBF_EOF (void) { return feof (fil); }
void DBF::DBF_FIELD_PRINTF (int field_no, FILE* stream = stdout) {
char* toprint = buf + field [field_no].start;
for (int char_no = 0; char_no < field [field_no].len; char_no++) fprintf (stream, "%c", *toprint++);
} // void DBF::DBF_FIELD_PRINTF (int field_no, FILE* stream = stdout) |
-----------------------
Вечно всё приходится самому делать |
|