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.



 
  




 Autor
 Autor
		


 En línea
									En línea
								


 , por lo que estoy aprendiendo C por mi cuenta con Programación en C | Joyanes, pero bueno sin salir del tema..
 , por lo que estoy aprendiendo C por mi cuenta con Programación en C | Joyanes, pero bueno sin salir del tema..


 
						