URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 4658
[ Назад ]

Исходное сообщение
"Чтение заголовка *.dbf на C/C++"

Отправлено sandy , 20-Сен-05 01:53 
Проблема такова:
===============================================================
#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)

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

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


Содержание

Сообщения в этом обсуждении
"Чтение заголовка *.dbf на C/C++"
Отправлено gyn61 , 20-Сен-05 02:50 
>    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);

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


"Чтение заголовка *.dbf на C/C++"
Отправлено sandy , 20-Сен-05 11:25 
>>    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);
>
>Хотя не просче ли читать прямо в структуру?


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


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

А чем

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;


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

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

"Чтение заголовка *.dbf на C/C++"
Отправлено sandy , 23-Сен-05 20:55 
Спасибо всем. Вы мне здоровао помогли