| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
geniusmac
Registrado: 07 Feb 2014 Mensajes: 1
| Publicado: 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
| Publicado: 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 | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|
| |