Les cuento, tengo un archivo que almacena registros de longitud fija.
Mi archivo tiene un registro encabezado que almacena info sobre:
* El número de registros de datos del archivo
* La longitud de los registros de datos
+----------------------+
+ 5 + recordLength +
+----------------------+
+ NR+ MAS CAMPOS +
+----------------------+
+ 1 + .... data ........+
+ 2 + .... data ........+
+ 3 + .... data ........+
+ 4 + .... data ........+
+ 5 + .... data ........+
Código
Lo que hago al crear un archivo es inicializar los campos del registro encabezado y grabarlo:
typedef struct Record{ char firstName[20]; char lastName[20]; char nationality[20]; char DNI[9]; int age; int recordNumber; }Record; typedef struct Header{ int numberOfRecords; int recordLength; }Header;
Código
void createFile(char* nameFile) { FILE* fd; Header buffer; buffer.numberOfRecords = 0; buffer.recordLength = sizeof(Record); // Compruebo el valor inicial que se grabo en numberOfRecords y me da 0, es correcto }
Como se habrán dado cuenta cada registro Record tiene un campo el cual indica que numero de registro es.
Código:
int recordNumber;
El problema es en la función para agregar un registro al archivo:
Código
void addRecord(FILE** fd,Record data) { struct Header buffer; buffer.numberOfRecords++; data.recordNumber = buffer.numberOfRecords; // Compruebo el contenido del registro recibido. // Pero el campo NR no se actualizo... Sale un numero extrano data.recordNumber, data.firstName, data.lastName, data.nationality, data.DNI, data.age ); fgetchar(); // // int pos = (data.recordNumber-1) * buffer.recordLength + sizeof(Header); // fseek(*fd,2,0); // fwrite(&data,1, buffer.recordLength, *fd); // fseek(*fd,0,0); // fwrite(&buffer, 1,sizeof(Header), *fd); }
Mi problema es que cuando creo el archivo e inicializo el encabezado (numero de registros igual 0) funciona perfecto, pero cuando voy a leer luego el encabezado en ese campo esta un valor "extraño".
Aqui les dejo mi programa:
Código
#ifdef __linux__ #define CLEAN "CLEAR" #endif #ifdef __MINGW32__ #define CLEAN "CLS" #endif #ifdef __MINGW64__ #define CLEAN "CLS" #endif #include <stdio.h> #include <string.h> #include <stdlib.h> #define TAM_CADENA 20 typedef struct Record { char firstName[20]; char lastName[20]; char nationality[20]; char DNI[9]; int age; int recordNumber; }Record; typedef struct Header { int numberOfRecords; int recordLength; }Header; void readLine(char cadena[], int tam); int readInt(); void addRecord(FILE** fd,Record data); int getRecordNumber(FILE** fd); void createFile(char* nameFile); int subMenu(char* fileName); void menu(); int main(int argc, char *argv[]) { menu(); return 0; } void menu() { int op = 0; char nameFile[TAM_CADENA]; do{ op = readInt(); switch(op){ readLine(nameFile,TAM_CADENA); createFile(nameFile); fgetchar(); break; readLine(nameFile,TAM_CADENA); subMenu(nameFile); break; readLine(nameFile,TAM_CADENA); seeAll(nameFile); fgetchar(); break; fgetchar(); break; fgetchar(); break; fgetchar(); break; } }while(op!=6); } int subMenu(char* fileName) { FILE* fd; { return -1; } else { int op = 0, R; Record buffer; do{ R = getRecordNumber(&fd); op = readInt(); switch(op){ readLine(&buffer.firstName,TAM_CADENA); readLine(buffer.lastName,TAM_CADENA); readLine(buffer.nationality,TAM_CADENA); readLine(buffer.DNI,9); buffer.age = readInt(); addRecord(&fd, buffer); break; fgetchar(); break; break; } }while(op!=3); } return 0; } void createFile(char* nameFile) { FILE* fd; struct Header buffer; buffer.numberOfRecords = 0; buffer.recordLength = sizeof(Record); // Compruebo el valor inicial que se grabo en numberOfRecords // 0 es correcto } int getRecordNumber(FILE** fd) { struct Header buffer; return buffer.numberOfRecords; } void addRecord(FILE** fd,Record data) { struct Header buffer; buffer.numberOfRecords++; data.recordNumber = buffer.numberOfRecords; // Compruebo el contenido del registro recibido. // Pero el campo NR no se actualizo... Sale un numero extraño data.recordNumber, data.firstName, data.lastName, data.nationality, data.DNI, data.age ); fgetchar(); // // int pos = (data.recordNumber-1) * buffer.recordLength + sizeof(Header); // fseek(*fd,2,0); // fwrite(&data,1, buffer.recordLength, *fd); // fseek(*fd,0,0); // fwrite(&buffer, 1,sizeof(Header), *fd); } int seeAll(char* nameFile) { FILE* fd; { return -1; } else { struct Record buffer; struct Header header; { buffer.recordNumber, buffer.firstName, buffer.lastName, buffer.nationality, buffer.DNI, buffer.age ); } } return 0; } int readInt() { char buf[BUFSIZ]; char *p; long int i; { if (buf[0] != '\n' && (*p == '\n' || *p == '\0')) return i; } } void readLine(char cadena[], int tam) { char c; else { cadena[tam-1] = '\0'; } }
Gracias de antemano.