Inicializar estructura en C

EtherMaN

Hola escribo este mensaje a ver si podéis ayudarme a resolver un problema que tengo. Dispongo de una estructura parecida a esto:

typedef struct datos{
int loquesea;
char .. etc
} registros;

registros vector[75];

Mi idea es modificar una estructura , por ejemplo la de vector[74].loquesea de tal modo que quede vacío sin datos.

Aparte de esto, estoy usando ficheros binarios para guardar la estructura.

¿ Sabéis como puedo resolver el problema ?
Si me explico mal, intentare mejorar la pregunta.

Un saludo

Murdock

si te he entendido la intencion que persigues seria hacer esto:

vector[74].loquesea='\0'

asi tienes la variable vacia.

javithelong

Si tu estructura tiene campos dinámicos, deberías liberarlos uno a uno con "free(vector[74].campo)", sino, basta con que uno de los campos de la estructura haga de clave de validación. Esto es, poner un valor a uno de los campos que no tenga sentido en tu programa, pero signifique que el registro está vacío.

Por ejemplo, si tu estructura tiene un campo int id, que en tu programa solo puede tomar valores positivos, parece lógico poner a -1 este campo, lo que significa que el registro está vacío. Ahora antes de realizar cualquier cosa con un registro, miras que el campo esté positivo (si lo que quieres es insertar un nuevo registro, pos al revés, miras que esté vacío).

Que lo guardes como binario o como quieras no influye en esto, eso da igual.

Si no me explico o algo, avisa.

shortyStyle

Es questión de ir dejandoté marcas como dice #3.

Yo para la ID siempre uso un -1, para cadenas simplemente la pongo toda a \0.

Es tan sencillo como hacer un for, en tu caso :

for(i=0;i<75;i++){

   for(j=0;j<30;j++)
   vector[i].cadena[j]='\0';

vector.entero=-1;

...
...

vector.loquesea=loquetuquieras;
}

Lo de guardar la información en ficheros binario no tiene nada que ver, como si los guardas en modo texto.

EtherMaN

no me deja compilar, he probado eso y otras cosas y me da el siguiente error :

293 ..\main.c incompatible types in assignment

En cambio cambiar el valor con un scanf si que me deja :S

r2d2rigo

'\0' es un char, normal que no te deje asignarlo a un int.

Por que no pruebas con un memset? Suele venir mejor, porque te pone toda la estructura a 0 y asi luego no suele haber errores...

memset(&vector[0],'\0',sizeof(registros));

SeRiaL_k

vector[74].loquesea=null ;

:P

javithelong

Si tu variable id es entera, ponle un -1.

Si tu variable id es un puntero dinámico, libéralo y ponlo a null.

Si es una cadena de caracteres estática ponla a 0 (vector[a].cadena[0]="\0") (eso pone el primer caracter de la cadena a 0, y con eso te vale para tenerla borrada)

EtherMaN

ya he encontrado el problema. El archivo lo abría en modo de lectura solo y no me grababa la estructura con el vector borrado.

Algunas de vuestras opciones no funcionan del todo bien, al final me he decantado por la de memset ya que me parece la mas completa.

Gracias a todos por ayudarme a pesar de mi torpeza :P

T

CALLOC?

Zuki

Perdon si me equivoco pero de que C hablais? supongo ke de C++ no ?

r2d2rigo

C a pelo, el precursor de C++ (sin tipo de datos bool, operators new/delete, clases, etc).

Usuarios habituales