The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Чтение заголовка *.dbf на C/C++"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Чтение заголовка *.dbf на C/C++" 
Сообщение от sandy emailИскать по авторуВ закладки(ok) on 20-Сен-05, 01:53  (MSK)
Проблема такова:
===============================================================
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct DBF {
    int zerobyte;
    int y;
    int m;
    int d;
    unsigned long int recnum;
    unsigned long int descrleng;
    unsigned int recleng;
    int fieldnum;
    int flag;
    int charkod;
};

int main()
{
    FILE* F;
    if ((F=fopen("test.dbf","rb"))==0) {
printf("File does not open!\n");
exit(0);
    }

    unsigned char datahdr[32];
    DBF Header;
    fread(&datahdr, sizeof(unsigned char[32]), 1, F);

    Header.zerobyte=datahdr[0];
    Header.y=datahdr[1];
    Header.m=datahdr[2];
    Header.d=datahdr[3];
//    Header.recnum=datahdr[4];
    memcpy((char*)Header.recnum,datahdr+4,4);
//    Header.descrleng=datahdr[8];
    memcpy((char*)Header.descrleng,datahdr+8,2);
//    Header.recleng=datahdr[10];
    memcpy((char*)Header.recleng,datahdr+10,2);
    Header.fieldnum=(Header.descrleng-32)/32;
    Header.flag=datahdr[28];
    Header.charkod=datahdr[29];

    fclose(F);
    return 0;
}
============================================================

Если закоментировать все вызовы memcpy() и снять комментарии которые вы видите, то почти все в порядке, но мне из char[32] нужно извлечь long int в 4 байта. Потому решил воспользоваться memcpy(). В результате - core dumped. segmentatin fault

Вот, что я нарыл в отладчике:

=========================================
(gdb) run
Starting program: /usr/home/sandy/cpp/dbf/dd
(no debugging symbols found)...(no debugging symbols found)...
(no debugging symbols found)...(no debugging symbols found)...
(no debugging symbols found)...
Program received signal SIGSEGV, Segmentation fault.
0x080486cc in main ()
(gdb) where
#0  0x080486cc in main ()
#1  0x08048592 in _start ()
(gdb) up 0
#0  0x080486cc in main ()
(gdb) up 1
#1  0x08048592 in _start ()
(gdb) quit
The program is running.  Exit anyway? (y or n)

=================================================

Помогите, пожалуйста, разобраться.

  Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

1. "Чтение заголовка *.dbf на C/C++" 
Сообщение от gyn61 Искать по авторуВ закладки(ok) on 20-Сен-05, 02:50  (MSK)
>    memcpy((char*)Header.recnum,datahdr+4,4);
>    memcpy((char*)Header.descrleng,datahdr+8,2);
>    memcpy((char*)Header.recleng,datahdr+10,2);
    memcpy((char*)&Header.recnum,datahdr+4,4);
    memcpy((char*)&Header.descrleng,datahdr+8,2);
    memcpy((char*)&Header.recleng,datahdr+10,2);

Хотя не просче ли читать прямо в структуру?

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "Чтение заголовка *.dbf на C/C++" 
Сообщение от sandy emailИскать по авторуВ закладки(ok) on 20-Сен-05, 11:25  (MSK)
>>    memcpy((char*)Header.recnum,datahdr+4,4);
>>    memcpy((char*)Header.descrleng,datahdr+8,2);
>>    memcpy((char*)Header.recleng,datahdr+10,2);
>    memcpy((char*)&Header.recnum,datahdr+4,4);
>    memcpy((char*)&Header.descrleng,datahdr+8,2);
>    memcpy((char*)&Header.recleng,datahdr+10,2);
>
>Хотя не просче ли читать прямо в структуру?


Читать прямо в структуру я тоже думал. Но мне нужно, чтобы заголовок тоже хранился во время исполнения программы

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

4. "Чтение заголовка *.dbf на C/C++" 
Сообщение от gyn61 Искать по авторуВ закладки(ok) on 20-Сен-05, 12:23  (MSK)
>Читать прямо в структуру я тоже думал. Но мне нужно, чтобы заголовок
>тоже хранился во время исполнения программы

А чем

unsigned char datahdr[32];

удобней чем

struct {
    unsigned char zerobyte;
    unsigned char y, m, d;
    unsigned long recnum;
    unsigned short descrleng;
    unsigned short recleng;
    unsigned char filler[20];
} datahdr;

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

2. "Чтение заголовка *.dbf на C/C++" 
Сообщение от Profic Искать по авторуВ закладки on 20-Сен-05, 02:58  (MSK)
Вы его отправляете писать по адресу, находящемуся в соответствущем поле структуры (а это либо 0, либо случайный - не помню):
memcpy((char*)&Header.recnum,datahdr+4,4);
memcpy((char*)&Header.descrleng,datahdr+8,2);
memcpy((char*)&Header.recleng,datahdr+10,2);
Код, однако, непортабельный и сейчас мне откровенно не думается.
  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

5. "Чтение заголовка *.dbf на C/C++" 
Сообщение от Hordi emailИскать по авторуВ закладки on 20-Сен-05, 13:22  (MSK)
dbf-заголовки вообще-то имеют четко определенную структуру с четкой длинной полей. Поэтому проще и быстрее всего создать аналогичную структуру и читать в нее без всяких последующих трансляций. Другое дело если охота поизвращаться... ;)
  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

6. "Чтение заголовка *.dbf на C/C++" 
Сообщение от sandy emailИскать по авторуВ закладки(ok) on 23-Сен-05, 20:55  (MSK)
Спасибо всем. Вы мне здоровао помогли

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх


Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ]
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру