Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Ficheros en C

Estas en el tema de Ficheros en C en el foro de C/C++ en Foros del Web. Hola a todos!!,necesito realizar el siguente programa de estructuas y ficheros, pero no me termina de salir.A ver si alguien me puede echar un cable ...
  #1 (permalink)  
Antiguo 06/06/2006, 10:42
 
Fecha de Ingreso: junio-2005
Mensajes: 53
Antigüedad: 19 años, 7 meses
Puntos: 0
Ficheros en C

Hola a todos!!,necesito realizar el siguente programa de estructuas y ficheros, pero no me termina de salir.A ver si alguien me puede echar un cable please.Saludos y grasias anticipadas!!


//Escribe las instrucciones para buscar en el fichero1 los alumnos
de nombre "Javier" y copiarlos en el fichero 2.

Registro igual que en el ejercicio 5.
Struct reg_alumno alumno;*/
Código:
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

     struct reg_alumno
     {
      int edad;
      char nombre [25];
     };
      struct reg_alumno reg;

void cargar(void);
void copia(void);

void main (void)
{
int opcion;

do
{
clrscr();
printf("1.-Crear y añadir\n");
printf("2.-Copiar Javier\n");
printf("3.-Salir\n");
scanf("%d",&opcion);

switch(opcion)
{
case 1: cargar();
		  break;
case 2: copia();
		   break;
}
}
while(opcion!=3);
}

void copia(void)  //esta seria la funcion que pedia el examen
{
char fich1[20],fich2[20];
FILE *f1,*f2;

printf("Introduce el nombre del fichero a leer:\n");
flushall();
gets(fich1);

printf("Introduce el nombre del fichero a escribir:\n");
gets(fich2);

f1=fopen(fich1,"rt");
f2=fopen(fich2,"wt");

while(!feof(f1))
{
fgets(reg,sizeof(reg.nombre),f1);

if(strcmp(struct(reg.nombre)=="Javier"))
{
fprintf(f2,"%s %d",reg.nombre,reg.edad);
putc('\n',f2);
}
fgets(reg,sizeof(reg),f1);
}
fclose(f1);
fclose(f2);
}

void cargar(void)
{
FILE *f1;
char fich1[20];

printf("Introduce el nombre del fichero:\n");
flushall();
gets(fich1);

f1=fopen(fich1,"a");

printf("nombre:\n");
gets(reg.nombre);

while(strcmp(reg.nombre,"fin"))
{
printf("Edad:\n");
scanf("%d",&reg.edad);
flushall();
fprintf(f1,"%s %d",reg.nombre,reg.edad);
putc('\n',f1);
printf("nombre:");
gets(reg.nombre);

}
getch();

fclose(f1);
}
__________________
Mi Risa es mi espada,mi alegría mi escudo
  #2 (permalink)  
Antiguo 06/06/2006, 17:06
 
Fecha de Ingreso: abril-2006
Ubicación: Acapulco Gro. México
Mensajes: 483
Antigüedad: 18 años, 8 meses
Puntos: 2
Especifica:
En que parte de tu codigo crees que esta tu error.
O cuales son tus dudas en relacion a ficheros?
.....................segundos despues.............. (je je)
en realidad tienes un buen de errores, creo que tienes que estudiar un poco mas esto de ficheros en C y recodificar tu codigo nuevamente.
veo que estas usando mucho fgets indiscriminadamente jeje, esta funcion se usa cuando los datos a manejar son grandes cadenas de texto o en su caso grandes ficheros de texto.

cuando manejes estructuras o datos variados es mejor usar fscanf con ficheros de texto y read con archivos binarios.

Saludos.

Saludos.

Última edición por Nivel7; 06/06/2006 a las 17:15
  #3 (permalink)  
Antiguo 07/06/2006, 04:45
 
Fecha de Ingreso: junio-2005
Mensajes: 53
Antigüedad: 19 años, 7 meses
Puntos: 0
A ver he mnodificado la funcion, el rpoblema que tengo es que me copia todos los registros en el otro archivo que indico por teclado. Yo quiero que solo copie los que se llamnen Javier.Ya se que tengo errores por eso estoy aki para ver cuales son y aprender de ellos...espero que no te siente mal lo que te voy a decir pero,no se puede irde sobrao por la vida eh?. en fiomn, saludos y grasias por haber contestado

Código:
void copia(void)  
{
char fich1[20],fich2[20];
FILE *f1,*f2;


printf("Introduce el nombre del fichero a leer:\n");
flushall();
gets(fich1);

printf("Introduce el nombre del fichero a escribir:\n");
gets(fich2);

f1=fopen(fich1,"rt");
f2=fopen(fich2,"wt");

while(!feof(f1))
{
fscanf(f1,"%s %d",reg.nombre,&reg.edad);

if(!strcmp(strupr(reg.nombre),"Javier")==0)
{
fprintf(f2,"%s %d",reg.nombre,reg.edad);
putc('\n',f2);
}

}
fclose(f1);
fclose(f2);
}
__________________
Mi Risa es mi espada,mi alegría mi escudo
  #4 (permalink)  
Antiguo 07/06/2006, 16:13
 
Fecha de Ingreso: abril-2006
Ubicación: Acapulco Gro. México
Mensajes: 483
Antigüedad: 18 años, 8 meses
Puntos: 2
Ok, parece que esta mejor, solo verifica esto:

if(!strcmp(strupr(reg.nombre),"Javier")==0)

esta condicion se cumple solo si la cadena nombre es diferente a "Javier".
strcmp retorna 0 si las cadenas son iguales y 1 o -1 si es mayor o menor.

lo correcto, si queires que la condicion se solo si son iguales es:

if(!strcmp(strupr(reg.nombre),"Javier"))


QUe se supone que quieres decir con:
"no se puede irde sobrao por la vida eh?".

Saludos.
  #5 (permalink)  
Antiguo 17/06/2006, 20:21
Avatar de _Lucifer_  
Fecha de Ingreso: junio-2006
Mensajes: 1.662
Antigüedad: 18 años, 7 meses
Puntos: 28
Hola! si haces la correcion del amigo Nivel7 te deberia quedar algo como esto:

Código:
if(!strcmp(strupr(reg.nombre),"Javier"))
el problema es el siguiente, la funcion "strupr" convierte la cadena que recibe como parametro a mayusculas y cuando la funcion strcmp compara "JAVIER" con "Javier" arroja como resultado que son diferentes, cosa que es completamente cierto, entonces deberias coregir de la siguiente manera:

Código:
if(!strcmp(strupr(reg.nombre),"JAVIER")
o para hacerlo mas general:

Código:
if(!strcmp(strupr(reg.nombre),strupr(busqueda))
__________________
Si crees que no tiene sentido, etonces probablemente lo tenga... :arriba:
  #6 (permalink)  
Antiguo 20/06/2006, 09:58
Avatar de RootK
Moderador
 
Fecha de Ingreso: febrero-2002
Ubicación: México D.F
Mensajes: 8.004
Antigüedad: 22 años, 10 meses
Puntos: 50
aprovecho para mandarte al subforo de C/C++...

movido desde foro de programacion
__________________
Nadie roba nada ya que en la vida todo se paga . . .

Exentrit - Soluciones SharePoint & Net
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




La zona horaria es GMT -6. Ahora son las 18:19.