¡Advertencia!
Este tema no ha tenido respuestas en más de un mes. Recuerda que si deseas añadir una nueva debes cumplir con las normas de la web.
Me encuentro en la recta final de mi cuatrimestre. Mi profesor de programación y estructura de datos ha optado por repartir 30 puntos: una práctica de 15 puntos y el examen final de 15 (30pts total) ya que según él, si coloca el examen de 30 puntos, nadie pasara (y eso que solo quedamos 6, los otros retiraron). Necesito sacar estos 15 puntos de práctica para intentar pasar y necesito ver como tengo hecho este ejercicio (es el primero de tres), aquí va:

1.-Leer y almacenar registros en un archivo para la estructura siguiente. Debe escribir un segundo programa para listar todos los registros del archivo.


struct CLIENTE

{

char apellido[15], nombres[15];

int numero_cliente;

struct

{

char telefono[12], direccion[50], ciudad[15], provincia[15];

} personal;

};


Este es mi programa:

#include <stdio.h>
#include <fcntl.h>

struct CLIENTE{

char nombre[15], apellido[15];

int numero_cliente;

struct{

char telefono[12], direccion[50], ciudad[15], provincia[15];

} personal;

};



int main (){
struct CLIENTE cliente;
int continuar=0;
int fd;

fd = open("practicafinal.txt", O_WRONLY|O_CREAT);
if(fd > 0) {
do{
printf ("Ingrese el nombre: ");
scanf ("%s", cliente.nombre);
printf ("Ingrese el apellido: ");
scanf ("%s", cliente.apellido);
printf ("Ingrese su numero de cliente: ");
scanf ("%d", &cliente.numero_cliente);
printf ("Ingrese el telefono: ");
scanf ("%d", &cliente.personal);
fflush(stdin);
printf ("Ingrese su direccion: ");
scanf ("%s", &cliente.personal);
fflush(stdin);
printf ("Ingrese su ciudad: ");
scanf ("%s", &cliente.personal);
fflush(stdin);
printf ("Ingrese su provincia: ");
scanf ("%s", &cliente.personal);
fflush(stdin);

write(fd, &cliente, sizeof(struct CLIENTE));

printf ("Desea continuar?
1) Si
2) No
");
scanf("%d", &continuar);
printf("
");
} while (continuar==1);
close(fd);
}
else
printf ("El archivo no pudo ser abierto");

}


La forma de estructura que el profesor ha colocado no la entendí bien (creo que es una estructura dentro de otra estructura), quise modificarla (creando una sola estructura para todas las variables) y hacerla a mi manera, ya que no se la forma correcta de llamarla dentro de main. Pero temo de que no me lo corrija bien por cambiar la forma en que la coloco.


Cuando abro el archivo de texto, sale asi:



El profesor había realizado un ejercicio y también salía con esos símbolos raros. No recuerdo bien lo que dijo acerca de esos símbolos. Igual creo que mi programa no esta del todo bien.
No te preocupes por esos símbolos, es normal porque las estructuras de datos o registros se tienen que guardar en un archivo binario, no en un archivo de texto.

Técnicamente un archivo de texto también es un archivo binario ya que igualmente se tratan de archivos escritos en código máquina, pero se suelen diferenciar llamando archivo de texto a todo archivo que solo contenga caracteres de texto legibles por una persona humana (por ejemplo un archivo TXT escrito por ti mismo o un código escrito en C), mientras que se suele decir archivo binario a todos los ficheros que puedan o no contener algo de texto, pero que la mayoría de datos se presenten en el archivo con caracteres ilegibles al estar formateados de forma que puedan ser interpretados rápidamente por otros programas a la hora de abrirlos (por ejemplo una imagen PNG, un archivo PDF, un audio OGG, etc).

Como este archivo binario que quieres guardar solo tiene que ser leído por un programa que se encargue de leer registros a partir de un archivo, es normal que el archivo binario que estás guardando como practicafinal.txt parece que esté escrito en marciano.




Luego, todo esto lo tienes mal:

--
printf ("Ingrese el telefono: ");
scanf ("%d", &cliente.personal);
fflush(stdin);
printf ("Ingrese su direccion: ");
scanf ("%s", &cliente.personal);
fflush(stdin);
printf ("Ingrese su ciudad: ");
scanf ("%s", &cliente.personal);
fflush(stdin);
printf ("Ingrese su provincia: ");
scanf ("%s", &cliente.personal);
fflush(stdin);
--
Ahí lo que estás haciendo es intentar leer el número de teléfono como un entero y guardarlo en un puntero de estructura de datos anónima (la subestructura personal que está dentro de la estructura de datos cliente de tipo CLIENTE, no tiene tipo) y la conversión no será válida, por lo tanto los datos no se guardarán correctamente. Ten en cuenta en primer lugar que el teléfono está declarado como una variable de tipo char de tamaño 12 bytes:

--
char telefono[12], direccion[50], ciudad[15], provincia[15];
--

Por lo tanto tienes que cambiar el flag de tipo %d de entero por %s de cadena de caracteres cuando pide por el número de teléfono. Lo sabes y a lo mejor es un pequeño detalle que se te ha escapado, suele pasar mucho sobre todo si copias y pegas

Por otro lado y ya resolviendo tu duda sobre cómo acceder a los datos de un registro o estructura anidada, tan solo has de colocar otro operador de acceso (punto) hacia el nombre de cada dato de la subestructura anónima personal. Es decir, para el número de teléfono, especificar que se guardará en cliente.personal.telefono en lugar de intentar guardarlo en &cliente.personal. Lo mismo para el resto de datos de la estructura anónima personal.

Nótese también que he quitado el ampersand (&) en cliente.personal.telefono, al igual que tendrás que hacer con el resto de datos de la estructura personal, ya que como supongo que también sabrás, se llama implícitamente a la referencia de memoria cuando quieres acceder a un array entero (no al dato de un array).

Quedaría así ese trozo de código:

--

--

PD: Puede que necesites incluir la librería <unistd.h> a tu código para utilizar las funciones write y open que has invocado de forma implícita en el código.

Perro viejo de Habbo y de HabboStium. Y lo mismo en la vida real, pero sin el "perro".
Muchas Gracias! Si se me pasaron unas cuantas cosas, necesito trabajar con más cuidado jaja

Arregle el scanf para que lea cadenas en la dirección, ciudad y provincia. Después de todo me quedo así:

printf ("Ingrese el telefono: ");
	scanf ("%s", cliente.personal.telefono);
	fflush(stdin);
	printf ("Ingrese su direccion: ");
	scanf ("%[^
]s", cliente.personal.direccion);
	fflush(stdin);
	printf ("Ingrese su ciudad: ");
	scanf ("%[^
]s", cliente.personal.ciudad);
	fflush(stdin);
	printf ("Ingrese su provincia: ");
	scanf ("%[^
]s", cliente.personal.provincia);
	fflush(stdin);


Y agregue la biblioteca, gracias por todo


Perdona que te cite (creo que te llega notificación jaja) y haga doble post, pero tengo una duda rápida con respecto a este mismo tema...

Aquí, en este programa, ¿estamos LEYENDO y ALMACENANDO los datos? Unos amigos a los que les enseñe el programa, dicen que hace falta leer. ¿No estamos ya leyendo la información del usuario cuando introduce sus datos, y después, los almacenamos en una archivo.txt? eso es lo que creo yo.

Perdona que te cite (creo que te llega notificación jaja) y haga doble post, pero tengo una duda rápida con respecto a este mismo tema...

Aquí, en este programa, ¿estamos LEYENDO y ALMACENANDO los datos? Unos amigos a los que les enseñe el programa, dicen que hace falta leer. ¿No estamos ya leyendo la información del usuario cuando introduce sus datos, y después, los almacenamos en una archivo.txt? eso es lo que creo yo.

No pasa nada, ha pasado suficiente tiempo desde que publicaste la última respuesta y en estos casos se consiente el doblepost.

Lo que has estado haciendo en este ejercicio de momento es abrir un archivo solo para almacenar en él un registro de los datos introducidos en el programa. Lo que se referían tus compañeros en todo caso es que falta que el programa abriera el archivo guardado previamente para solo lectura, guardar en memoria los datos que se lean de dicho archivo, y que se muestren por pantalla para demostrar o comprobar que se hayan guardado bien.

Perro viejo de Habbo y de HabboStium. Y lo mismo en la vida real, pero sin el "perro".


Perdona que te cite (creo que te llega notificación jaja) y haga doble post, pero tengo una duda rápida con respecto a este mismo tema...

Aquí, en este programa, ¿estamos LEYENDO y ALMACENANDO los datos? Unos amigos a los que les enseñe el programa, dicen que hace falta leer. ¿No estamos ya leyendo la información del usuario cuando introduce sus datos, y después, los almacenamos en una archivo.txt? eso es lo que creo yo.

No pasa nada, ha pasado suficiente tiempo desde que publicaste la última respuesta y en estos casos se consiente el doblepost.

Lo que has estado haciendo en este ejercicio de momento es abrir un archivo solo para almacenar en él un registro de los datos introducidos en el programa. Lo que se referían tus compañeros en todo caso es que falta que el programa abriera el archivo guardado previamente para solo lectura, guardar en memoria los datos que se lean de dicho archivo, y que se muestren por pantalla para demostrar o comprobar que se hayan guardado bien.


Bien, perfecto, ya lo hice

Gracias de nuevo