C/Visual C - Duda struct en fincheros

 
Vista:
sin imagen de perfil
Val: 185
Bronce
Ha aumentado 1 puesto en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Duda struct en fincheros

Publicado por carlos (95 intervenciones) el 07/03/2018 19:39:20
Buenas gente, me paso a preguntar porque a lo mejor me estoy colando estoy ahora leyendo el manejo de archivos en en la parte de usar estructuras la cosa es que he echo esto:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <stdio.h>
#include <conio.h>
#include <string.h>
struct persona{
	char nombre[20];
	char edad[3];
	char residencia[40];
};
char terminar[5] = "fin";
int main(){
	char num[3];
	struct persona personas;
	FILE* fichero;
	fichero = fopen("gente.dat", "wt");
	if(fichero==NULL){
		printf("archivo no encontrado");
	}
	printf("Escribe nombre");
	gets(personas.nombre);
	fprintf(fichero,"%s\n", personas.nombre);
		printf("Escribe edad");
	gets(personas.edad);
	fprintf(fichero,"%s",personas.edad);
	printf("Escribe lugar de residencia");
	gets(personas.residencia);
	fputs(personas.residencia,fichero);
	return 0;
}
/

La cosa es que no logre meter en la edad (que no deberia ser char sino int) y al final tuve que usar fprintf
char edad[3];

1
2
3
printf("Escribe edad");
gets(personas.edad);
fprintf(fichero,"%s",personas.edad);

¿Me dará problemas de algún tipo trabajar asi?¿De ser asi cual seria la manera correcta porque no me deja poner decimales aun cambiandolo a int %d

Muchas gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Duda struct en fincheros

Publicado por Tu profe (1 intervención) el 08/03/2018 00:39:06
Sí, lamento decirte que vas a tener muchísimos problemas programando mientras sigas usando conio y gets.

Al respecto de conio.h, la misma wikipedia https://es.wikipedia.org/wiki/Conio.h dice lo siguiente:
Éste no es parte de la biblioteca estándar de C o ISO C, ni está definida por POSIX.

Lo cual significa que tu programa compilara con TurboC y DevC++ si no me equivoco, yo compilo con GCC.
Dispones de opciones más potentes y estándares, por ejemplo curses.

Respecto a gets https://pablohaya.com/2013/10/12/diferencia-entre-scanf-gets-y-fgets/ hasta el compilador te pide por favor que no la utilices, así que hazle caso al compi.

Por último, utiliza funciones, no hagas todo en main, main debería ejecutar 2 o 3 líneas de código, entre sus tareas esta recibir y delegar los parametros de entrada a la aplicación y devolver el estado del programa una vez ejecutado.

Ya siento ser tan realista... Un saludo!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 185
Bronce
Ha aumentado 1 puesto en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Duda struct en fincheros

Publicado por carlos (95 intervenciones) el 09/03/2018 19:27:31
1º Tendre en cuenta quitar el conio.h
2º El compilador no me dice nada del gets, pregunto por la forma de meter la informacion
3º No puedo utilizar funciones porque no he llegado a esa parte del libro sino para cada cosa determinada lo dividiria en scripts

Gracias por responderme de todas maneras y a ver si alguien puede responder mi duda original
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 88
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Duda struct en fincheros

Publicado por Thanatos (29 intervenciones) el 10/03/2018 06:58:42
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <stdio.h>   // fgets(), getchar(), FILE, fopen(), fclose(), fwrite(), fread(), fprintf(), stdin, stderr
#include <stdlib.h>  // EXIT_SUCCESS, EXIT_FAILURE
#include <string.h>  // strcspn()
 
enum {
    SIZE_NOM = 20,
    SIZE_RES = 40
};
 
struct Persona {
    char nombre[SIZE_NOM];
    int edad;
    char residencia[SIZE_RES];
};
 
int main(void) {
    struct Persona persona = { "", 0, "" };
    const char rutaFichero[] = "gente.dat";
    FILE *fichero;
 
    /* --------------------- Lee los Datos --------------------- */
 
    printf("Nombre: ");
    (void) fgets(persona.nombre, SIZE_NOM, stdin);
    persona.nombre[strcspn(persona.nombre, "\r\n")] = '\0';
 
    printf("Edad: ");
    scanf("%d", &persona.edad);
    (void) getchar();
 
    printf("Residencia: ");
    (void) fgets(persona.residencia, SIZE_RES, stdin);
    persona.residencia[strcspn(persona.residencia, "\r\n")] = '\0';
 
    /* ------------------- Escribe el Fichero ------------------- */
 
    fichero = fopen(rutaFichero, "a+");
    if (!fichero) {
        fprintf(stderr, "\n* Error al abrir el fichero *\n");
        return EXIT_FAILURE;
    }
 
    fwrite(&persona, sizeof persona, (size_t) 1u, fichero);
    fclose(fichero);
 
    /* --------------------- Lee el Fichero --------------------- */
 
    fichero = fopen(rutaFichero, "r");
    if (!fichero) {
        fprintf(stderr, "\n* Error al abrir el fichero *\n");
        return EXIT_FAILURE;
    }
 
    while (fread(&persona, sizeof persona, (size_t) 1u, fichero)) {
        printf("%s, %d, %s\n",
               persona.nombre, persona.edad, persona.residencia);
    }
    fclose(fichero);
 
    return EXIT_SUCCESS;
}

No hice otras verificaciones necesarias (por ejemplo, al leer los datos), para que el código no sea muy extenso. Sin usar funciones, se tendrían que repetir varias líneas
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 185
Bronce
Ha aumentado 1 puesto en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Duda struct en fincheros

Publicado por carlos (95 intervenciones) el 16/03/2018 17:06:55
La mayoria de cosas que usas no las he dado todavia como los sizeof fwrite o stderr

Pero el problema es unicamente para escribir en el archivo

Pero probando lo que use parece que no hay problema para sacar datos

De todas maneras gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar