Pessoal, isso tá me dando nos nervos. Estou implementando um simples banco de dados em C. Ele permite criar e abrir tabelas e adicionar, ler, editar e apagar registros. A função de leitura é muito parecida com a de edição. A diferença é que após posicionar o cursor do arquivo na posição onde está o registro, a função de leitura lê um registro e a de edição sobrescreve esse registro. Ou deveria. Acontece que a edição não funciona, e acho que a culpa é do fwrite! A seguir o código:
As estruturas que representam a tabela na memória
Um campo da tabela
struct ltfield {
char name[LT_ID_LEN + 1];
int size;
char type;
};
typedef struct ltfield LTField;
struct ltable {
int version[3];
int fieldsLen;
int registerLen; /* Esse é o comprimento de um registro de acordo com o vetor de campos */
int count;
long data; /* Esse é a posição no arquivo onde os registro começam a ser gravados */
long insert;
char match;
int pos;
int cursor; /* Esse é o registro sobre o qual a operação será realiza */
LTField *fields; /* Esse é o vetor de campos fornecido na criação da tabela */
FILE *file;
char **buffer; /* Este buffer serve para a leitura e gravação de registros */
unsigned opened :1;
unsigned error :7;
};
typedef struct ltable LTable;
A função de leitura
#include "ltables.h"
#include "lterr.h"
#include <stdio.h>
#include <string.h>
int lt_read(LTable *table) {
register int F;
char active = 0;
/* Checa a tabela */
if (table->error)
return LTERR_TABLE_HAS_ERROR;
if (!table->opened)
return LTERR_TABLE_IS_CLOSED;
/* Corrige cursores atrevidos :-) */
if (table->cursor >= table->count)
table->cursor = table->count - 1;
else if (table->cursor < 0)
table->cursor = 0;
/* Acha a posição de leitura */
fseek(table->file,
table->data + table->cursor * (sizeof(char) + table->registerLen),
SEEK_SET);
/* Checa se o registro está ativo */
active = getc(table->file);
if (!active)
return LTERR_INACTIVE_REGISTER;
/* Limpa o buffer, para que dados anteriores não deixem fragmentos */
for (F = 0; F < table->fieldsLen; F++)
memset(table->buffer[F], '\0', table->fields[F].size);
/* Lê o registro para o buffer AQUI FUNCIONA*/
for (F = 0; F < table->fieldsLen; F++)
fread(table->buffer[F], sizeof(char), table->fields[F].size,
table->file);
return 0;
}
A função de Edição
#include "ltables.h"
#include "lterr.h"
#include <stdio.h>
#include <string.h>
int lt_edit(LTable *table) {
register int F;
char active = 0;
long int offset=0;
/* Checa a tabela */
if (table->error)
return LTERR_TABLE_HAS_ERROR;
if (!table->opened)
return LTERR_TABLE_IS_CLOSED;
/* Corrige cursores atrevidos :-) */
if (table->cursor >= table->count)
table->cursor = table->count - 1;
else if (table->cursor < 0)
table->cursor = 0;
/* Acha a posição de edição */
offset=table->data + table->cursor * (sizeof(char) + table->registerLen);
fseek(table->file, offset, SEEK_SET);
/* Checa se o registro está ativo */
active = getc(table->file);
if (!active)
return LTERR_INACTIVE_REGISTER;
// Grava o buffer AQUI !NAO! FUNCIONA!
for (F = 0; F < table->fieldsLen; F++)
fwrite(table->buffer[F], sizeof(char), table->fields[F].size, table->file);
fflush(table->file);
// Limpa o buffer, para que dados anteriores não deixem fragmentos
for (F = 0; F < table->fieldsLen; F++)
memset(table->buffer[F], '\0', table->fields[F].size);
return 0;
}
O link para o codigo completo vai aqui? http://www.4shared.com/zip/rRuN9OLB/ltables.html
Meu email: [email removido]
Obrigado.
