Sie sind auf Seite 1von 6

OBJETIVOS: Realizar operaciones de lectura y escritura sobre archivos de texto Entender el concepto de puntero ARCHIVOS Hasta el momento, la lectura

y escritura de datos que hemos llevado en los programas que hemos diseado en el curso se han hecho por medio del teclado y de la pantalla respectivamente. Sin embargo, existen varias razones para realizar estas tareas por medio de archivos: El volumen de datos que se desea leer es muy alto, lo que hace que su ingreso sea engorroso. Adems, al realizar esta operacin por teclado, si se comete un error se debe comenzar de nuevo. Se requiere obtener datos provenientes de otro programa Al mirar los resultados ocupan mucho espacio y solo se puede distinguir la pantalla final Se quieren guardar los resultados.

Instruccin printf En el taller anterior se estudio la instruccin printf de la librera stdio.h para escribir por pantalla texto, o algn dato al cual se le especificaba el formato. De manera general, puede decirse que esta instruccin trabaja de la siguiente forma: printf(texto %especificador de campo,variable); como por ejemplo: printf(El resultado es %f,r); //donde r debe estar declarada float Los especificadotes de campo ms comunes son: %d %u %f %lf %c %s %e %x %o %p Entero con signo Entero sin signo Variable real (float) Variable real(double) Carcter Cadena de texto Notacin cientfica Hexadecimal sin signo Octal sin signo Escribe un puntero

Instruccin scanf De manera anloga, la instruccin scanf sirve para leer variables especificndole de que tipo son. De manera general, esta instruccin trabaja de la siguiente forma:

scanf(%especificador de campo,&variable); como por ejemplo: scanf(%d,&a); //donde a debe estar declarada int Ejemplo: Codificar un algoritmo en C que lea dos valores reales e imprima su suma #include <stdio.h> void main() { float x1, x2, y; printf("Ingrese x1: "); scanf("%f",&x1); printf("Ingrese x2: "); scanf("%f",&x2); y = x1 + x2; printf("Su suma es: %.3f", y); } En este caso el especificador %.3f hace que se imprima un valor real con 3 cifras decimales Instrucciones fprintf fscanf Estas instrucciones trabajan de manera similar a printf y scanf, con la diferencia que leen y escriben sobre archivos de texto. Para utilizarlas se deben seguir los siguientes pasos. 1. Declarar la variable que hace referencia al archivo. Esto se hace mediante la instruccin FILE *variable_archivo; 2. Se abre el archivo utilizando la instruccin: variable_archivo = fopen (nombre del archivo.txt , tipo de acceso); El tipo de acceso sirve para especificar para qu se va a abrir el archivo. Los tipos mas usados son: "r" abrir un archivo existente para leer de l. "w" crear un archivo nuevo para escribir en l. "a" aadir a un archivo existente. Al escribir va guardando los resultados en la ltima lnea del archivo. Importante: si el nombre del archivo no especifica su ubicacin, el compilador asume que se encuentra en la misma carpeta donde se encuentre el archivo cpp

3. Se utiliza la instruccin de lectura/escritura. Dependiendo de la operacin que se desee realizar se utiliza el fprintf o el fscanf de la siguiente manera: Para escribir: Igual que con el printf pero especificando en que archivo se va a escribir. fprintf(variable_archivo, %especificador de campo, variable); Para leer: Igual que con el scanf pero especificando de que archivo se va a leer. fscanf(variable_archivo, %especificador de campo, &variable); 4. Se cierra el archivo. Siempre que se abre un archivo utilizando fopen, se debe cerrar luego que de se realicen las operaciones sobre l. fclose(variable_archivo) Ejemplo: Suponga que en un archivo llamado calificaciones.txt se encuentran los siguientes datos: 10 3.5 4.1 3.8 2.6 4.0 3.9 4.8 5.0 3.4 4.0 Codificar un algoritmo en C para leer estas calificaciones y escribir en un archivo llamado resultados.txt cuantos ganaron, cuantos perdieron y cual fue el promedio (con dos cifras decimales). #include <stdio.h> void main() { int N, ganaron, perdieron, i; float c[20], s, promedio; FILE *archivo_entrada, *archivo_salida; archivo_entrada = fopen("calificaciones.txt","r"); archivo_salida = fopen("resultados.txt","w");

fscanf(archivo_entrada, "%d", &N); for(i=0;i<=N-1;i++) { fscanf(archivo_entrada, "%f", &c[i]); } ganaron = 0; perdieron = 0; s = 0; for(i=0;i<=N-1;i++) { if (c[i] >= 2.95) ganaron++; else perdieron++; s = s + c[i]; } promedio = s/N; fprintf(archivo_salida, "El numero de estudiantes que ganaron es: %d", ganaron); fprintf(archivo_salida, "\nEl numero de estudiantes que perdieron es: %d", perdieron); fprintf(archivo_salida, "\nEl promedio del grupo es: %.2f", promedio); fclose(archivo_entrada); fclose(archivo_salida); }

PUNTEROS Un puntero es una variable que apunta a la direccin de memoria de otra variable.
A 500 0035AB *pa

El nombre de una variable de tipo puntero debe comenzar comienzan con el signo * y se debe declarar del mismo tipo de la variable a la que apunta. En el contexto de los punteros:

& se llama el operador de direccin y se utiliza para obtener la direccion de una variable * se llama operador de desreferenciacin y se utiliza para obtener el valor que se encuentra en una direccin. Ejemplo: Realizar prueba de escritorio al siguiente cdigo #include <stdio.h> void main() { int k , *pk; k = 8; pk = &k; printf("k = %d se encuentra en la direccion %x\n",k,&k); printf("k = %d se encuentra en la direccion %x\n",*pk,pk); } Como se observa en el ejemplo, al escribir simplemente pk nos estamos refiriendo a la direccin de memoria a la que apunta, es decir, a la direccin de k. Mientras que al escribir *pk nos estamos refiriendo al valor que se encuentra en esa direccin, es decir al valor de k. Un uso importante de punteros es su paso como argumentos de funciones. Cuando una variable normal se transmite a una funcin lo que se est pasando no es en realidad la variable como tal si no su valor, esto implica que si se cambia el valor en la funcin, no cambia en el programa principal o donde se le haya llamado. Por el contrario, cuando un puntero se usa como argumento lo que se pasa a la funcin es la direccin de la variable a la que apunta, esto significa que la maquina va a la direccin de memoria donde esta la variable y si la modifica en la funcin queda modificada en el programa principal o donde se haya llamado. Ejemplo #include <iostream.h> void funcion1(int *px) { *px = 13; } void main() { int a = 5; cout<<"\nvalor de la variable en el main antes de llamar la funcion: "<<a; funcion1(&a);

cout<<"\nvalor de la variable en el main antes de llamar la funcion: "<<a<<"\n"; } Teniendo en cuenta esta propiedad de los punteros es posible crear funciones que devuelvan ms de un resultado. Es decir, que permitan cambiar los valores de ms de una variable y que dichos cambios sean vistos desde el programa principal o desde donde se llamen sin necesidad de declararlas como globales. Ejemplo # include <iostream.h> void cambio(float *x,float *y) { float aux; aux=*x; *x= *y; *y= aux; } void main () { float a,b; cout<<"Ingrese a: "; cin>>a; cout<<"\nIngrese b: "; cin>>b; cambio(&a,&b); cout<<"\nValores despues de llamar la funcion\n"; cout<<"a: "<<a<<"\n"; cout<<"b: "<<b<<"\n"; }

Das könnte Ihnen auch gefallen