Foros del Web » Programación para mayores de 30 ;) » Programación General »

Algun fiera en c? tema de structs y ficheros

Estas en el tema de Algun fiera en c? tema de structs y ficheros en el foro de Programación General en Foros del Web. Buenas, pues llevo aqui un rato liado con un asunto y no hay manera de que me salga. El tema es que yo lanzo esta ...
  #1 (permalink)  
Antiguo 17/03/2005, 16:39
 
Fecha de Ingreso: junio-2004
Mensajes: 283
Antigüedad: 19 años, 11 meses
Puntos: 0
Algun fiera en c? tema de structs y ficheros

Buenas, pues llevo aqui un rato liado con un asunto y no hay manera de que me salga.

El tema es que yo lanzo esta funcion

leer(& reg);


la cual me da valores a cada campo del struct reg tal cual asi:

void leer(struct registre *reg)
{
int i,j;
j=0;
for(i=9;i<strlen(buffer);i++) {
reg->usuari[j]=buffer[i];
j++; } reg->usuari[j]='\0';
reg->ipreg=inet_ntoa(addr_client.sin_addr);
reg->control ='Y';

}

Bueno, el caso es que quiero almacenar este struct en un fichero, pero no puedo coger el valor de todo el struct con sus campos, es decir, si hago

printf("%s\n",reg.usuari);

me saca por pantalla correctamente el campo

pero si quiero sacar todo el struct, me sale una L :O

printf("%c\n",& reg);

La verdad ya no sé cómo hacerlo.

Bueno gracias, a ver si alguien lo sabe...por probar..

salu2
__________________
pOrtfOliO
  #2 (permalink)  
Antiguo 17/03/2005, 16:44
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Eso no tiene mucho sentido, estas diciendole a C que imprima un caracter y pasando la dirección de memoria de la variable reg printf("%c\n",& reg);

No hay ninguna función que te imprima todos los valores de una estructura, deberías hacerla vos y sería algo así:

Código:
void printReg(struct registre *reg)
{
  printf("%s\r\n, reg->usuari);
  printf("%c\r\n, reg->control);
  //etc
}
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #3 (permalink)  
Antiguo 17/03/2005, 16:53
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
En cuanto a grabar la estructura en el disco podes usar usar cadenas de tamaño predefinido y así no tendrías más que hacer un write/read con el tamaño de la estructura:

Código:
struct registre
{
  char usuari[256];
  char control;
};

registre reg;
read(file, &reg, sizeof(registre)); << lee desde un archivo una estructura registre, 257 bytes

reg.control = 'N';
write(file, &reg, sizeof(registre)); << escribe a un archivo una estructura registre
Sino también podes escribir en el archivo el tamaño de la cadena.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO

Última edición por Eternal Idol; 18/03/2005 a las 01:50
  #4 (permalink)  
Antiguo 17/03/2005, 16:59
 
Fecha de Ingreso: junio-2004
Mensajes: 283
Antigüedad: 19 años, 11 meses
Puntos: 0
perdon, lo he copiado mal, en teoria era %s no %c, pero estos printsf solo los habia puesto para probar, ya que lo que me interesa es grabar varias estructuras en un fichero, por eso queria ver si se guardaba bien el valor de &reg.

Gracias, voy a probar
__________________
pOrtfOliO
  #5 (permalink)  
Antiguo 17/03/2005, 17:08
 
Fecha de Ingreso: junio-2004
Mensajes: 283
Antigüedad: 19 años, 11 meses
Puntos: 0
El caso es que cuando quiero guardar la estructura en el fichero no me lo hace bien. Lo hago de esta forma:

fwrite (&reg, sizeof(reg),1,f);

En cambio, si solo quiero guardar un campo de la estructura en el fichero, si se me guarda bien:

fwrite (reg.usuari, sizeof(reg.usuari),1,f);

Por qué debe ser?

Gracias
__________________
pOrtfOliO
  #6 (permalink)  
Antiguo 18/03/2005, 00:39
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
¿Como es la estructura registre exactamente? ¿Tiene algún puntero?
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #7 (permalink)  
Antiguo 18/03/2005, 01:55
 
Fecha de Ingreso: junio-2004
Mensajes: 283
Antigüedad: 19 años, 11 meses
Puntos: 0
si, la estructura es asi:

struct registre {
char* ipreg;
char control;
char usuari[10];
};

gracias
__________________
pOrtfOliO
  #8 (permalink)  
Antiguo 18/03/2005, 01:56
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Acá tenes un ejemplo con una estructura de tamaño fijo:

Código:
#include <windows.h>
#include <stdio.h>

struct registro
{
  char usuario[256];
  char control;
};

void main()
{
  registro first;
  strcpy(first.usuario, "Juan");
  first.control = 'N';
  registro second;
  strcpy(second.usuario, "Jose");
  second.control = 'Y';
  FILE *Out = fopen("c:\\struct_data.txt", "w+");
  fwrite(&first, sizeof(registro), 1, Out);
  fwrite(&second, sizeof(registro), 1, Out);
  fclose(Out);

  registro *primero = (registro*)malloc(sizeof(registro));
  registro *segundo = (registro*)malloc(sizeof(registro));
  FILE *In = fopen("c:\\struct_data.txt", "r+");
  fread(primero, sizeof(registro), 1, In);
  fread(segundo, sizeof(registro), 1, In);
  printf("Nombre %s\r\n", primero->usuario);
  printf("Control %c\r\n", primero->control);
  printf("Nombre %s\r\n", segundo->usuario);
  printf("Control %c\r\n", segundo->control);
  free(primero);
  free(segundo);
  fclose(In);
}
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #9 (permalink)  
Antiguo 18/03/2005, 02:13
 
Fecha de Ingreso: junio-2004
Mensajes: 283
Antigüedad: 19 años, 11 meses
Puntos: 0
Gracias por tus respuestas Eternal Idol, lo he probado con una estructura fija y sí me funciona, pero al haber el puntero (que es necesario) el tema ya no me funciona.

Otra cosa, a la hora de insertar los registros, por ejemplo si digo que el tamaño es el del registro, si los campos no ocupan ese tamaño completamente en el fichero en el que almaceno se me guarda basura y caracteres extraños. A que es debido?

Bueno, gracias y perdona que sea tan pesado!
__________________
pOrtfOliO
  #10 (permalink)  
Antiguo 18/03/2005, 02:23
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Acá tenes un ejemplo utilizando un puntero, no con las funciones de sockets así te queda algo de trabajo ;)

Código:
#include <windows.h>
#include <stdio.h>

struct registro
{
  char *dns;
  char usuario[10];
  char control;
};

void writeReg(registro *reg, FILE *Out)
{
  unsigned int dnsSize = strlen(reg->dns);
  fwrite(&dnsSize, sizeof(unsigned int), 1, Out);
  fwrite(reg->dns, dnsSize, 1, Out);
  fwrite(reg->usuario, 10, 1, Out);
  fwrite(&reg->control, 1, 1, Out);
}

void readReg(registro *reg, FILE *In, unsigned int dnsSize)
{
  reg->dns = (char*)malloc(dnsSize + 1);
  ZeroMemory(reg->dns, dnsSize + 1);
  fread(reg->dns, dnsSize, 1, In);
  fread(reg->usuario, 10, 1, In);
  fread(&reg->control, 1, 1, In);
}	

void main()
{
  registro first;
  first.dns = (char*)malloc(1024);
  strcpy(first.dns, "http://www.yahoo.com");
  strcpy(first.usuario, "Juan");
  first.control = 'N';
  registro second;
  second.dns = (char*)malloc(1024);
  strcpy(second.dns, "http://www.google.com");
  strcpy(second.usuario, "Jose");
  second.control = 'Y';
	
  FILE *Out = fopen("c:\\struct_data.txt", "w+");
  writeReg(&first, Out);
  writeReg(&second, Out);
  free(first.dns);
  free(second.dns);
  fclose(Out);
  
  FILE *In = fopen("c:\\struct_data.txt", "r+");
  unsigned int regSize = 0;
  fread(&regSize, sizeof(unsigned int), 1, In);
  registro *primero = (registro*)malloc(sizeof(registro));
  readReg(primero, In, regSize);
  printf("DNS %s\r\n", primero->dns);
  printf("Nombre %s\r\n", primero->usuario);
  printf("Control %c\r\n", primero->control);
  free(primero->dns);
  free(primero);
 
  registro segundo;
  fread(&regSize, sizeof(unsigned int), 1, In);
  readReg(&segundo, In, regSize);
  printf("DNS %s\r\n", segundo.dns);
  printf("Nombre %s\r\n", segundo.usuario);
  printf("Control %c\r\n", segundo.control);	
  free(segundo.dns);
  fclose(In);
}
En cuanto a lo que comentas sobre los caracteres basura, estos estan en memoria realmente y por eso los escribe en el archivo, usá ZeroMemory para escribir todos los bytes a cero y listo.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO

Última edición por Eternal Idol; 18/03/2005 a las 02:24
  #11 (permalink)  
Antiguo 18/03/2005, 02:59
 
Fecha de Ingreso: junio-2004
Mensajes: 283
Antigüedad: 19 años, 11 meses
Puntos: 0
Muchas gracias! me has ayudado un monton! ahora ya tengo los registros insertados, ya solo me falta buscar entre los registros!
__________________
pOrtfOliO
  #12 (permalink)  
Antiguo 18/03/2005, 03:08
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
De nadas, me alegro de que te haya servido! :)
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas (incluyéndote)




La zona horaria es GMT -6. Ahora son las 03:00.