Как извлечь данные из dbf файла в массив на C?

Пользователь

от akeem , в категории: C/C++ , 2 года назад

Как извлечь данные из dbf файла в массив на C?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

2 ответа

Пользователь

от magdalen_kub , 2 года назад

@akeem 

Для того чтобы извлечь данные из DBF файла в массив на C, можно использовать следующий алгоритм:

  1. Открыть DBF файл с помощью функции fopen().
1
2
3
4
5
FILE* fp = fopen("file.dbf", "rb");
if (fp == NULL) {
    perror("Error opening file");
    exit(1);
}


  1. Считать заголовок DBF файла, который содержит информацию о структуре таблицы, с помощью функции fread().
1
2
unsigned char header[32];
fread(header, sizeof(unsigned char), 32, fp);


  1. Вычислить количество записей в таблице.
1
int num_records = ((int)header[4]) + ((int)header[5] << 8) + ((int)header[6] << 16) + ((int)header[7] << 24);


  1. Вычислить количество полей в таблице.
1
int num_fields = (int)((header[8] + header[9] * 256) / 32);


  1. Создать массив структур для хранения данных из таблицы.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
struct Record {
    char field1[11];
    char field2[11];
    // ...
};

struct Record* records = (struct Record*)malloc(num_records * sizeof(struct Record));
if (records == NULL) {
    perror("Error allocating memory");
    exit(1);
}


  1. Считать данные из таблицы с помощью функции fread().
1
2
3
4
5
for (int i = 0; i < num_records; i++) {
    fread(&records[i].field1, sizeof(char), 11, fp);
    fread(&records[i].field2, sizeof(char), 11, fp);
    // ...
}


  1. Закрыть файл и освободить память.
1
2
fclose(fp);
free(records);


Обратите внимание, что этот алгоритм предполагает, что DBF файл имеет фиксированный формат и содержит только поля типа char с фиксированной длиной. Если в таблице есть поля других типов, то для их считывания нужно использовать соответствующие функции чтения.

Пользователь

от kyleigh_runte , год назад

@akeem 

Пример кода, позволяющий извлечь данные из DBF файла в массив на C:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <stdio.h>
#include <stdlib.h>

struct Record {
    char field1[11];
    char field2[11];
};

int main() {
    FILE* fp = fopen("file.dbf", "rb");
    if (fp == NULL) {
        perror("Error opening file");
        exit(1);
    }

    unsigned char header[32];
    fread(header, sizeof(unsigned char), 32, fp);

    int num_records = ((int)header[4]) + ((int)header[5] << 8) + ((int)header[6] << 16) + ((int)header[7] << 24);
    int num_fields = (int)((header[8] + header[9] * 256) / 32);

    struct Record* records = (struct Record*)malloc(num_records * sizeof(struct Record));
    if (records == NULL) {
        perror("Error allocating memory");
        exit(1);
    }

    for (int i = 0; i < num_records; i++) {
        fread(&records[i].field1, sizeof(char), 11, fp);
        fread(&records[i].field2, sizeof(char), 11, fp);
    }

    fclose(fp);

    // Вывод данных
    for (int i = 0; i < num_records; i++) {
        printf("Record %d:
", i + 1);
        printf("Field 1: %s
", records[i].field1);
        printf("Field 2: %s

", records[i].field2);
    }

    free(records);

    return 0;
}


Приведенный выше код считывает данные из DBF файла и хранит их в массиве структур struct Record. Данные выводятся в консоль для демонстрации. Вы можете изменить структуру struct Record и код в соответствии с вашими потребностями. Также обратите внимание на важность проверки ошибок при открытии файла и выделении памяти.