Проблема такова:
===============================================================
#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)=================================================
Помогите, пожалуйста, разобраться.
> 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);Хотя не просче ли читать прямо в структуру?
>> 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);
>
>Хотя не просче ли читать прямо в структуру?
Читать прямо в структуру я тоже думал. Но мне нужно, чтобы заголовок тоже хранился во время исполнения программы
>Читать прямо в структуру я тоже думал. Но мне нужно, чтобы заголовок
>тоже хранился во время исполнения программыА чем
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;
Вы его отправляете писать по адресу, находящемуся в соответствущем поле структуры (а это либо 0, либо случайный - не помню):
memcpy((char*)&Header.recnum,datahdr+4,4);
memcpy((char*)&Header.descrleng,datahdr+8,2);
memcpy((char*)&Header.recleng,datahdr+10,2);
Код, однако, непортабельный и сейчас мне откровенно не думается.
dbf-заголовки вообще-то имеют четко определенную структуру с четкой длинной полей. Поэтому проще и быстрее всего создать аналогичную структуру и читать в нее без всяких последующих трансляций. Другое дело если охота поизвращаться... ;)
Спасибо всем. Вы мне здоровао помогли