/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Ayudas ejercicios ficheros C.

 
      Índice del Foro elrincondelc.com -> C/C++ en General
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
geniusmac



Registrado: 07 Feb 2014
Mensajes: 1

MensajePublicado: 07/02/2014 11:55 am
Título: Ayudas ejercicios ficheros C.

Hola buenas tardes tengo un problema a la hora de descifrar que funcion realizan los bucles for de la funcion getCampos, Les pongo el programa haber si me pueden echar una mano.gracias de antemano.

#include<stdio.h>
void comprobarEstructura(char nombre[]);
void getCampo(char linea[], int claveCampo, char campo[]);
void printNumExpedientePassword(char nombre[]);
int main(){

char nombre[50];



printf("\nPor favor,teclee el nombre del fichero:\n");
fflush(stdin);
scanf("%s",nombre);
printf("\nLa estuctura de cada linea del fichero debe ser número_de_expediente#nombre_alumno#contraseña#:\n");
//llamamos a las funciones
comprobarEstructura(nombre);
printNumExpedientePassword(nombre);

}

void getCampo(char linea[], int claveCampo, char campo[]){// creamos una funcion para obtener los campos que necesitamos ya
// que en ambas funciones requeridas por el programa vamos a necesitarla;
// para ello vamos a necesitas 3 cosas la linea leida, un valor para cada campo y
// y otro char para que nos devuelva el cmapo que queremos

int a, b, c,cont=1;
for (a=0;cont<claveCampo;a++)//
{ // recirremos cada linea mietras que el cont sea menor que la clave del campo en
//el q estamos, por eso ponemos el contador incialmente a uno ya que el 1 campo es el 1.
if(linea[a]=='#')//==>Asi recorremos las lineas buscando la almoadilla
{
cont++;

}
}
for (b=a,c=0;linea[b]!='#';b++,c++)
{
campo[c] = linea[b];
}
campo[c] = 0;



}
void printNumExpedientePassword(char nombre[]){
FILE *f;
char numeroExpediente[20],password[30],linea[80];
f = fopen(nombre,"r");
if(f == NULL)
{
printf("\nNo ha sido posible abrir el archivo");

}else
{
fgets(linea,80,f);
while(!feof(f))
{
getCampo(linea,1,numeroExpediente);
getCampo(linea,3,password);
printf("\n Numero Expediente : %s, Contraseña: %s",numeroExpediente,password);
}
fclose(f);
}
}
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 7516
Ubicación: Mexico

MensajePublicado: 08/02/2014 8:33 am
Título:

No entiendo.

Si tu hiciste el programa debes saber exactamente lo que hace y si alguien te lo dio tampoco deberías tener problemas ya que esta comentado (en mi opinión en exceso).

Si eliminamos los comentarios de esa función tenemos:
Código:
void getCampo(char linea[], int claveCampo, char campo[])
{
   int a, b, c, cont = 1;
   
   for (a = 0; cont < claveCampo; a++){
      if (linea[a] == '#'){
         cont++;
      }
   }
   
   for (b = a, c = 0; linea[b] != '#'; b++, c++) {
      campo[c] = linea[b];
   }
   campo[c] = 0;
}

La función recibe tres argumentos: el primero es la linea a procesar, el segundo el campo a copiar (el primer campo tiene el indice uno) y el tercero y ultimo es el array donde se copiara el campo.

El primer bucle inicia el contador "a" con el valor cero e itera procesando cada carácter hasta encontrar (y pasar) el numero de '#' indicados. El objetivo es encontrar el inicio del campo a copiar. Por ejemplo si se quiere copiar el campo numero uno el bucle no itera una sola vez, el valor de "a" es cero y ese es el inicio (el indice en el array) del primer campo.

El segundo bucle es todavía mas sencillo. Copia todos los caracteres a partir de la posición "linea[a]" (inicio del campo) hasta encontrar el carácter que indique el final de este (el carácter '#').

La ultima linea de la función agrega el caracter '\0' que marca el final de una cadena en el lenguaje C.

----

Por ultimo el programa no funcionara correctamente tal como esta ya que tiene un error critico en la función "printNumExpedientePassword". Ese bucle debe cambiarse a:
Código:
while (fgets(linea, 80, f) != NULL){
   getCampo(linea, 1, numeroExpediente);
   getCampo(linea, 3, password);
   printf("Numero Expediente : %s, Contraseña: %s\n", numeroExpediente, password);
}


Un saludo
_________________
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Volver arriba
      Índice del Foro elrincondelc.com -> C/C++ en General
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com