Práctica 6: Ficheros Operaciones básicas sobre ficheros: probar el siguiente programa. //Laboratorio de Programación: Prácticas de C++ //Práctica 6.1. programa de lectura/escritura de tipos básicos en un archivo #include <iostream> #include <fstream> using namespace std; main() { // Escritura en el archivo ofstream fsalida("ejemplo.txt"); //flujo de salida y apertura del archivo if (!fsalida){ cout << "El archivo de salida no pudo abrirse"; return 1;} fsalida << "Laboratorio_Programacion" << endl; fsalida << 15 << ' ' << hex << 15 << endl; fsalida.close(); // Lectura del archivo ifstream fentrada("ejemplo.txt"); if (!fentrada){ cout << "El archivo de entrada no pudo abrirse"; return 1;} string cadena; int i,j; fentrada>>cadena>>i>>hex>>j; cout<<"Contenido del fichero: "<<endl; cout<<cadena<<' '<<i<<' '<<hex<<j<<endl; fentrada.close(); system("pause"); return 0; } Operaciones con archivos binarios: organizar en un proyecto (.h, .cpp) el siguiente código y comprobar su funcionamiento. //Laboratorio de Programación: Prácticas de C++ //Práctica 6.2. lectura/escritura de caracteres en un archivo #include <iostream> #include <fstream> #include <string> using namespace std; void leer_nombre(string &ruta); int escribir(string ruta); int leer(string ruta); void leer_nombre(string &ruta) { cout<<"Introducir nombre del fichero "; cin>>ruta; } int escribir(string ruta) // función que escribe caracteres introducidos por teclado en un archivo { char car; ofstream flujo; flujo.open(ruta.c_str(),ios::out | ios::binary); if (!flujo) { cout <<"\nEl fichero no pudo abrirse"; return 1;} cout<<"\nIntroducir caracteres (finalizar con '*') "<<endl; do { cin.get(car); if (car!='*') flujo.put(car); } while (car!='*'); flujo.close(); return 0; } int leer(string ruta) // permite visualizar el contenido de un fichero { char car; ifstream flujo; flujo.open(ruta.c_str(),ios::in | ios::binary); if (!flujo) { cout <<"\nEl fichero no pudo abrirse"; return 1; } cout << "\nContenido del archivo: "<<endl; flujo.get(car); while (!flujo.eof()){ cout<<car; flujo.get(car);} cout<<endl; system("pause"); flujo.close(); return 0; } Archivos binarios: E/S de estructuras en un archivo. Dada la siguiente estructura para contener los datos típicos de un empleado, escribe dos funciones, una para introducir los datos de un empleado por teclado y calcular su salario, y otra para visualizarlos por pantalla. Probar el funcionamiento del siguient programa: ... struct empleado { char DNI[9]; unsigned int num_horas; unsigned int horas_extras; float salario; }; ... main() { empleado pepe, x; fstream f; entrada_datos(pepe); visualizar(pepe); f.open("empleados.dat", ios::out | ios::binary); f.write((char *)&pepe, sizeof(empleado)); f.close(); f.open("empleados.dat", ios::in | ios::binary); f.read((char *)&x, sizeof(empleado)); visualizar(x); f.close(); return 0; } Funciones con cadenas: getline. Comprobar los cambios introducidos con respecto a la práctica 6.1. //Laboratorio de Programación: Prácticas de C++ //Práctica 6.4. Utilización de la función getline #include <iostream> #include <fstream> #include <string> using namespace std; main() { string cadena1,cadena2; ofstream fsalida("ejemplo"); if (!fsalida){ cout << "El archivo de salida no pudo abrirse"; return 1;} cout<<"\nIntroducir cadena "; getline(cin,cadena1); fsalida << cadena1<<endl; fsalida << 15 << ' ' << hex << 15 << endl; fsalida.close(); ifstream fentrada("ejemplo"); if (!fentrada){ cout << "El archivo de entrada no pudo abrirse"; return 1;} int i,j; getline(fentrada,cadena2); fentrada >>i>>hex>>j; cout<<cadena2<<' '<<i<<' '<<hex<<j<<endl; fentrada.close(); system("pause"); return 0; } Prueba este ejemplo de control de errores de E/S. //Laboratorio de Programación: Prácticas de C++ //Práctica 6.5. Funciones de control de errores en operaciones de E/S #include <iostream> using namespace std; void mostrar_indicadores(); int main() { int i; cout << "Estado de los indicadores para cin:"<<endl; mostrar_indicadores(); cout << "Introduce un caracter (la variable es entera): "; cin >> i; cout << "Estado de los indicadores tras el error:"<<endl; mostrar_indicadores(); cin.clear(); cout << "Estado de los indicadores tras borrar indicadores:"<<endl; mostrar_indicadores(); system("pause"); return 0; } void mostrar_indicadores() { cout << "rdstate(): " << cin.rdstate()<<endl; cout << "eof(): " << cin.eof()<<endl; cout << "fail(): " << cin.fail()<<endl; cout << "bad(): " << cin.bad()<<endl; cout << "cin.good(): " << cin.good()<<endl; } Acceso directo a un archivo. Prueba la ejecución del siguiente programa. //Laboratorio de Programación: Prácticas de C++ //Práctica 6.6. Programa ejemplo de acceso directo a un archivo #include <iostream> #include <fstream> using namespace std; int main() { int i; char semana[7][10] = {"Lunes", "Martes", "Miercoles", "Jueves", "Viernes", "Sabado","Domingo"}; char cad[10]; ofstream fsalida("dias.dat", ios::out | ios::binary); // Almacenar los nombres de los días en un fichero cout << "Almacenando nombres de dias..." <<endl; for(i=0;i<7;i++) fsalida.write(semana[i],10); fsalida.close(); ifstream fentrada("dias.dat", ios::in | ios::binary); //Acceso secuencial cout<<"Dias de la semana:"<<endl; fentrada.read(cad,10); do { cout<<cad<<endl; fentrada.read(cad, 10); } while(!fentrada.eof()); fentrada.clear(); // Acceso aleatorio cout <<"\nFin de semana:"<<endl; for(i = 5; i <= 6; i++) { fentrada.seekg(10*i, ios::beg); fentrada.read(cad, 10); cout<<cad<<endl; } cout<<"Introducir numero de 1 a 7: "; cin>>i; fentrada.seekg(10*(i-1), ios::beg); fentrada.read(cad, 10); cout<<"Dia "<<i<<"-->"<<cad<<endl; fentrada.close(); system("PAUSE"); return 0; } Laboratorio de Programación - Escuela Superior de Ingeniería Informática (http://trevinca.ei.uvigo.es/~pcuesta/laboprog/) Área de Lenguajes y Sistemas Informáticos - Universidade de Vigo (Última actualización: )