C/Visual C - Coger datos de una sección concreta del archivo

 
Vista:
sin imagen de perfil
Val: 141
Bronce
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Coger datos de una sección concreta del archivo

Publicado por carlos (75 intervenciones) el 27/07/2020 21:27:30
Estoy rehaciendo unos ejercicios practicos el problema es que vi que los ejercicios se me borraron asi que total me puse otra vez para acordarme,el problema es que hay ejercicios que no logro resolver

Me he quedado en este ya que me da error y no se que hacer
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
62
63
64
65
66
67
68
69
/*EJERCICIO 6.9.1
Ampliar el programa anterior(el array de structs con 10 personas) para que el dato
que indique el usuario se lea sin leer descartar antes los que le preceden,sino que
se salte directamente a la ficha deseada usando "fseek"*/
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
struct{
	char nombre[15];
	int edad;
	char residencia[40];
}Persona[10];
 
int main(){
	FILE* archivo;
	int contador=0;
	char textoT[5];
	int valorFicha;
	int posicion;
 
	if((archivo=fopen("gente.dat","wt"))==NULL){
		printf("Tio esto no existe");
		exit(1);
	}
	for (contador=0;contador<10;contador++){
		printf("Introduzca nombre");
		gets(Persona[contador].nombre);
		fwrite(Persona[contador].nombre,sizeof(Persona[contador].nombre),1,archivo);
		if(strcmp(Persona[contador].nombre,"")==0){
			printf("Saliendo");
			break;
		}
		printf("Introduzca numero");
		gets(textoT);
		sscanf(textoT,"%d",&Persona[contador].edad);
		fwrite(&Persona[contador].edad,sizeof(Persona[contador].edad),1,archivo);
 
		printf("Introduzca Residencia");
		gets(Persona[contador].residencia);
		fwrite(Persona[contador].residencia,sizeof(Persona[contador].residencia),1,archivo);
	}
	fclose(archivo);
	//////////////////////////////////////////////////
 
 
	printf("Abriendo modo lectura\n");
	if((archivo=fopen("gente.dat","rt"))==NULL){
		printf("Archivo no encontrado");
	}
	printf("Introduzca el numero de persona que quieres saber informacion");
	gets(textoT);
	sscanf(textoT,"%d",&contador);
contador--;
	valorFicha=sizeof(Persona)*contador;
 
	fseek(archivo,valorFicha,SEEK_SET);
 
	posicion=ftell(archivo);
	fread(&Persona,sizeof(Persona),1,archivo);
printf("Posicion: %d\n",posicion);
			printf("Nombre: %s\n",Persona.nombre);
				printf("Posicion: %d\n",posicion);
			printf("Edad: %d\n",Persona.edad);
			printf("Posicion: %d\n",posicion);
			printf("Residencia: %s\n",Persona.residencia);
 
		}
Me da error de estructura en los ultimos printf pero es que no se que poner ya que en los ejercicios anteriores que no usaba fseek y ftell, no me daban ese problema y si hago Persona[contador].nombre,¿entonces de que sirve el fseek en este ejercicio?
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
Imágen de perfil de Rodrigo
Val: 316
Bronce
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Coger datos de una sección concreta del archivo

Publicado por Rodrigo (91 intervenciones) el 28/07/2020 14:39:47
Persona es un arreglo de 10 structs. Quieres leer 10 elementos o solo 1.
Si es solo 1, no tiene sentido usar Persona, pues Persona es un arreglo de 10.

Al definir la struct, podrias tal vez hacer

1
2
3
4
5
struct{
	char nombre[15];
	int edad;
	char residencia[40];
} unaPersona, Persona[10];

y cuando leas, en la linea 61 y siguientes, usa unaPersona, no Persona (que, repito, se trata de un arreglo).
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: 141
Bronce
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Coger datos de una sección concreta del archivo

Publicado por carlos (75 intervenciones) el 29/07/2020 14:34:11
Ya lo he cambiado pero ¿me puedes explicar porque tengo que hacer el arreglo de arriba? Y que quieres decir con leer 1 o leer 10, Se supone que lo pide del 1 al 10 y da la informacion

Y lo de abajo ya no se como ponerlo lo he dejado asi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
printf("Abriendo modo lectura\n");
if((archivo=fopen("gente.dat","rt"))==NULL){
    printf("Archivo no encontrado");
}
printf("Introduzca el numero de persona que quieres saber informacion");
gets(textoT);
sscanf(textoT,"%d",&contador);
contador--;
valorFicha=sizeof(Persona)*contador;
 
fseek(archivo,valorFicha,SEEK_SET);
 
posicion=ftell(archivo);
fread(&unaPersona,sizeof(Persona),1,archivo);
printf("Posicion: %d\n",posicion);
printf("Nombre: %s\n",unaPersona.nombre);
printf("Posicion: %d\n",posicion);
printf("Edad: %d\n",unaPersona.edad);
printf("Posicion: %d\n",posicion);
printf("Residencia: %s\n",unaPersona.residencia);

Coge bien el nombre pero el resto mal, no se, no entiendo como funciona esto
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
Imágen de perfil de Rodrigo
Val: 316
Bronce
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Coger datos de una sección concreta del archivo

Publicado por Rodrigo (91 intervenciones) el 30/07/2020 02:35:40
Una vez que el archivo esta escrito, entiendo que quieres leer solo 1 registro. Es asi?
Si es asi, lee solo 1.
En ese caso, usa unaPersona. Nunca mas uses Persona, pues Persona es un arreglo de 10.

No tiene sentido

1
fread(&unaPersona,sizeof(Persona),1,archivo);

pues mezclas unaPersona (1 registro) y Persona (10 registros).

->
1
fread(&unaPersona,sizeof(unaPersona),1,archivo);

y para leer, estas haciendo justo antes un fseek sin sentido

1
valorFicha=sizeof(Persona)*contador;

pues Persona, como sabes, es un arreglo.

Sugiero cambiarlo por

1
valorFicha=sizeof(unaPersona)*contador;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 141
Bronce
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Coger datos de una sección concreta del archivo

Publicado por carlos (75 intervenciones) el 30/07/2020 15:30:40
nada este es el resultado

Introduzca nombrecarlos
Introduzca numero14
Introduzca Residenciamongo
Introduzca nombre
SaliendoAbriendo modo lectura
Introduzca el numero de persona que quieres saber informacion1
Posicion: 0
Nombre: carlos
Posicion: 0
Edad: 1828716544
Posicion: 0
Residencia: ongo
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
Imágen de perfil de Rodrigo
Val: 316
Bronce
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Coger datos de una sección concreta del archivo

Publicado por Rodrigo (91 intervenciones) el 30/07/2020 18:27:34
Sugiero publicar el programa tambien
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
Imágen de perfil de Rodrigo
Val: 316
Bronce
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Coger datos de una sección concreta del archivo

Publicado por Rodrigo (91 intervenciones) el 30/07/2020 18:30:19
Me di cuenta que cuando escribes, estas escribiendo campo por campo, pero al leer, lo haces leyendo la struct completa.
Sugiero pedit los datos, guardar en la struct y al momento de escribir en el archivo, escribir la struct completa.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 141
Bronce
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Coger datos de una sección concreta del archivo

Publicado por carlos (75 intervenciones) el 30/07/2020 19:38:59
¿Y eso como seria? A mi eso es lo unico que me han enseñado escribir cada vez los 3 datos en una condicional y escribirlo en el archivo
El programa es el mismo pero en vez de Persona es unaPersona
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: 141
Bronce
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Coger datos de una sección concreta del archivo

Publicado por carlos (75 intervenciones) el 01/08/2020 15:47:38
Por fin parece que funciona,gracias Rodrigo eres una persona genial o sea que para cosas para direcciones de archivo deberia ponerlo todo en una estructura y cuando termine de meter todos los datos ponerlo en el archivo como es¿me equivoco?

El codigo lo he dejado asi

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
62
63
64
65
66
67
68
69
70
/*EJERCICIO 6.9.1
Ampliar el programa anterior(el array de structs con 10 personas) para que el dato
que indique el usuario se lea sin leer descartar antes los que le preceden,sino que
se salte directamente a la ficha deseada usando "fseek"*/
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
struct{
	char nombre[15];
	int edad;
	char residencia[40];
}unaPersona,Persona[10];
 
int main(){
	FILE* archivo;
	int contador=0;
	char textoT[5];
	int valorFicha;
	int posicion;
 
	if((archivo=fopen("gente.dat","wt"))==NULL){
		printf("Tio esto no existe");
		exit(1);
	}
	for (contador=0;contador<10;contador++){
		printf("Introduzca nombre");
		gets(Persona[contador].nombre);
		if(strcmp(Persona[contador].nombre,"")==0){
			printf("Saliendo");
			break;
		}
		printf("Introduzca numero");
		gets(textoT);
		sscanf(textoT,"%d",&Persona[contador].edad);
 
 
		printf("Introduzca Residencia");
		gets(Persona[contador].residencia);
 
	fwrite(&Persona[contador],sizeof(Persona[contador]),1,archivo);
	//Si se hace teniendo en cuenta una estructura o formato se tiene que respetar y no poner los datos por separado
	}
	fclose(archivo);
	//////////////////////////////////////////////////
 
 
	printf("Abriendo modo lectura\n");
	if((archivo=fopen("gente.dat","rt"))==NULL){
		printf("Archivo no encontrado");
	}
	printf("Introduzca el numero de persona que quieres saber informacion");
	gets(textoT);
	sscanf(textoT,"%d",&contador);
contador--;
	valorFicha=sizeof(unaPersona)*contador;
 
	fseek(archivo,valorFicha,SEEK_SET);
 
	posicion=ftell(archivo);
	fread(&unaPersona,sizeof(unaPersona),1,archivo);
printf("Posicion: %d\n",posicion);
			printf("Nombre: %s\n",unaPersona.nombre);
				printf("Posicion: %d\n",posicion);
			printf("Edad: %d\n",unaPersona.edad);
			printf("Posicion: %d\n",posicion);
			printf("Residencia: %s\n",unaPersona.residencia);
 
		}
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