Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Архив форумов ЦИТФорума
Море(!) вопросов - Море(!) ответов
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
Как правильно задавать вопросы

Второй вопрос по Си

 
Перейти:  
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование
Предыдущая тема :: Следующая тема  
Автор Сообщение
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);
}

И ни фига не получилось. Толкните, где копать? Стоит ли связываться с классами?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
AVES



Зарегистрирован: 12.09.2004
Сообщения: 132
Откуда: С-Петербург

СообщениеДобавлено: Пт Мар 04 2005 11:41    Заголовок сообщения: Ответить с цитатой

Цитата:
Head = malloc(32);
Field = malloc(32);

Ф-ция malloc() взвращает указатель на выделенную память.
компилятор вообще не скомпилит прогу.

ЗЫ И вообще IMHO 32 байта маловато под такие структуры будет.
используй оператор sizeof(тип)

загляни сюда: http://forum.citforum.ru/viewtopic.php?t=33651
там ф-ция есть createMatrix(int n)
_________________
Ошибки в программах - есть следствие ошибок в ДНК
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
критикан



Зарегистрирован: 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)

-----------------------
Вечно всё приходится самому делать
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
pcstupid



Зарегистрирован: 13.02.2004
Сообщения: 61

СообщениеДобавлено: Пт Мар 04 2005 12:23    Заголовок сообщения: Re: Вечно всё приходится самому делать Ответить с цитатой

У меня пока зависание дня на два... После чтения кода. Пока вопросов нема...
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2002 phpBB Group
Русская поддержка phpBB

 

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 6608306, ICQ 232284597
Пресс-релизы — pr@citforum.ru
Послать комментарий
Информация для авторов
This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2006 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...