davidcastrosalinas

Ejemplo completo de manejo de ficheros y vectores [apoyo para el taller 1

Sep 22nd, 2020
1,009
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.41 KB | None | 0 0
  1. /**DAVID CASTRO - UTEM 20200922 - EDD 2020-02**/
  2. #include <iostream>
  3. #include <fstream>
  4. #include <vector>
  5. #include <sstream>
  6.  
  7. using namespace std;
  8.  
  9. struct Persona{
  10.     string nombre;
  11.     int nota1;
  12.     int nota2;
  13.     float promedio;
  14. };
  15.  
  16. /** Para el caso vectores muy grandes utilizaremos una variable global**/
  17. Persona vectorPersonas[5];
  18.  
  19. /**Prototipos de funciones**/
  20. void crearArchivoConDatosDePrueba(string, char);
  21. void leerArchivoSimple(string);
  22. void leerArchivoSeparadosPorCaracter(string, char);
  23. void leerArchivoSeparadosPorCaracterYDejarEnVector(string, char, Persona v[], int &);
  24. void crearArchivoDesdeVector(string, char, Persona v[], int);
  25.  
  26. //Programa  principal
  27. int main() {
  28.     //esta línea nos permite utilizar tíldes
  29.     setlocale(LC_CTYPE,"Spanish");
  30.  
  31.     string nombreArchivo = "misdatos.csv";
  32.     /**PASO 1: creamos el archivo con datos aleatorios **/
  33.     crearArchivoConDatosDePrueba(nombreArchivo, ';');
  34.  
  35.     /**PASO 2: leemos el archivo y lo mostrarmos de forma simple (línea a línea)**/
  36.     leerArchivoSimple(nombreArchivo);
  37.  
  38.     /**PASO 3: leemos el archivo y lo obtenemos una línea, pero luego,
  39.       esa línea, la volvemos a separar en base al caracter indicado**/
  40.     leerArchivoSeparadosPorCaracter(nombreArchivo, ';');
  41.  
  42.     /**PASO 4: leemos el archivo y lo obtenemos una línea, pero luego,
  43.       esa línea, la volvemos a separar en base al caracter indicado
  44.       y además volcamos esa información a un vector de tipo persona **/
  45.     int cantidadPersonas = 0; //esta variable retornará la cantidad de personas leídas en el archivo
  46.     leerArchivoSeparadosPorCaracterYDejarEnVector(nombreArchivo, ';', vectorPersonas, cantidadPersonas );
  47.  
  48.     cout <<"Se han leído "<<cantidadPersonas<<" desde el archivo"<<endl;
  49.  
  50.     /**PASO 5: tomamos la información existente en el vector la volcamos a un archivo de texto separado por tabuladores**/
  51.     crearArchivoDesdeVector("ArchivoSeparadoPorTab.txt", '\t', vectorPersonas, cantidadPersonas);
  52.  
  53. }
  54.  
  55.  
  56.  
  57. void crearArchivoConDatosDePrueba(string nombreArchivo, char caracterDeSeparacion) {
  58.     /**utilizamos una variable de tipo ofstream**/
  59.     ofstream archivo;
  60.     /**abrimos el archivo , "ios::out" Sólo salida de información **/
  61.     archivo.open(nombreArchivo, ios::out);
  62.  
  63.     //para ejemplo utilizamos un vector con datos
  64.     Persona datos[5];
  65.     datos[0].nombre = "David";
  66.     datos[0].nota1 = 7;
  67.     datos[0].nota2 = 6;
  68.  
  69.     datos[1].nombre = "Lucia";
  70.     datos[1].nota1 = 4;
  71.     datos[1].nota2 = 7;
  72.  
  73.     datos[2].nombre = "Diego";
  74.     datos[2].nota1 = 3;
  75.     datos[2].nota2 = 4;
  76.  
  77.     datos[3].nombre = "Maria";
  78.     datos[3].nota1 = 7;
  79.     datos[3].nota2 = 4;
  80.  
  81.     datos[4].nombre = "Jorge";
  82.     datos[4].nota1 = 1;
  83.     datos[4].nota2 = 4;
  84.  
  85.  
  86.     if(archivo.is_open()) {
  87.         /**creamos el archivo con los datos el vector separamos por el caracter indicado en la funcion**/
  88.         for(int i=0; i< 5;i++)
  89.             archivo <<datos[i].nombre << caracterDeSeparacion << datos[i].nota1 << caracterDeSeparacion << datos[i].nota2<<endl;
  90.  
  91.         //cerramos el archivo
  92.         archivo.close();
  93.         cout <<"archivo creado con éxito"<<endl;
  94.     } else {
  95.         cout <<"error";
  96.     }
  97. }
  98.  
  99. /**Esta función permite mostrar un archivo línea a linea**/
  100. void leerArchivoSimple(string nombreArchivo){
  101.     ifstream archivo;
  102.     //ios::in >> sólo lectura
  103.     archivo.open(nombreArchivo.c_str(), ios::in);
  104.  
  105.     cout <<"[Mostrar archivo simple: linea a línea]"<<endl;
  106.     //pregunta si se pudo abrir el archivo
  107.     if(archivo.is_open()){
  108.         //creamos un variable para guardar las líneas obtenidos del archivo
  109.         string linea;
  110.         //recorre las líneas del archivo y las deja en la variable linea
  111.         while (getline(archivo, linea)){
  112.             cout <<linea<<endl;
  113.         }
  114.     } else {
  115.         cout << "Error en la apertura del archivo "+nombreArchivo;
  116.     }
  117. }
  118.  
  119.  
  120. void leerArchivoSeparadosPorCaracter(string nombreArchivo, char caracterDeSeparacion){
  121.     cout <<endl<<"[Leer archivo y separar linea obtenida por partes]"<<endl;
  122.  
  123.     ifstream archivo;
  124.     archivo.open(nombreArchivo.c_str(), ios::in);
  125.  
  126.     if(archivo.is_open()){
  127.         string linea;
  128.         while (getline(archivo, linea)){
  129.             /**creamos la variable ss que un formato similar a la lectura del archivo**/
  130.             stringstream ss(linea);
  131.             /**variable temp para obtener la separacion por el caracter**/
  132.             string temp;
  133.             /**creamos una variable items que contendrá los elementos de cada línea separados por el caracter indicado**/
  134.             vector<string> items;
  135.  
  136.             /**recorremos la linea obtenida y la separamos por el caracter indicado**/
  137.             while (getline(ss, temp, caracterDeSeparacion))
  138.                 items.push_back(temp); //la dejamos en un vector de items
  139.  
  140.             /**una vez que separamos por items, los podemos ocupar por separado**/
  141.             string nombre = items[0];
  142.  
  143.             /** utilizamos .c_str() para transformar un string a una vector de caracteres**/
  144.             /** utilizamos la funcion atoi para transformar un vector de caracteres a número**/
  145.             int nota1 = atoi(items[1].c_str());
  146.             int nota2 = atoi(items[2].c_str());
  147.  
  148.             float promedio = (float)(nota1 + nota2)/ 2;
  149.             cout <<"nombre: "<<nombre;
  150.             cout <<", nota1: "<<nota1;
  151.             cout <<", nota2: "<<nota2;
  152.             cout <<", promedio: "<<promedio<<endl;
  153.         }
  154.     } else {
  155.         cout << "Error en la apertura del archivo "+nombreArchivo;
  156.     }
  157. }
  158.  
  159.  
  160. /**procesamos el archivo y lo volcamos sobre un vector**/
  161. void leerArchivoSeparadosPorCaracterYDejarEnVector(string nombreArchivo, char caracterDeSeparacion, Persona v[], int &cantidadPersonas){
  162.     cout <<endl<<"[Leer archivo y separar linea obtenida por partes y volcar a un vector]"<<endl;
  163.  
  164.     ifstream archivo;
  165.     archivo.open(nombreArchivo.c_str(), ios::in);
  166.  
  167.     //inicializamos la variable, para luego incrementarla
  168.     cantidadPersonas = 0;
  169.  
  170.     if(archivo.is_open()){
  171.         string linea;
  172.         while (getline(archivo, linea)){
  173.             /**creamos la variable ss que un formato similar a la lectura del archivo**/
  174.             stringstream ss(linea);
  175.             /**variable temp para obtener la separacion por el caracter**/
  176.             string temp;
  177.             /**creamos una variable items que contendrá los elementos de cada línea separados por el caracter indicado**/
  178.             vector<string> items;
  179.  
  180.             /**recorremos la linea obtenida y la separamos por el caracter indicado**/
  181.             while (getline(ss, temp, caracterDeSeparacion))
  182.                 items.push_back(temp); //la dejamos en un vector de items
  183.  
  184.             /**una vez que separamos por items, los podemos ocupar por separado**/
  185.             string nombre = items[0];
  186.  
  187.             /** utilizamos .c_str() para transformar un string a una vector de caracteres**/
  188.             /** utilizamos la funcion atoi para transformar un vector de caracteres a número**/
  189.             int nota1 = atoi(items[1].c_str());
  190.             int nota2 = atoi(items[2].c_str());
  191.             float promedio = (float)(nota1 + nota2)/ 2;
  192.  
  193.             v[cantidadPersonas].nombre = nombre;
  194.             v[cantidadPersonas].nota1 = nota1;
  195.             v[cantidadPersonas].nota2 = nota2;
  196.             v[cantidadPersonas].promedio = promedio;
  197.  
  198.             //incrementamos la cantidad de personas
  199.             cantidadPersonas++;
  200.         }
  201.         cout <<"***Archivo correctamente procesado"<<endl;
  202.     } else {
  203.         cout << "Error en la apertura del archivo "+nombreArchivo;
  204.     }
  205. }
  206.  
  207.  
  208. //tomamos la información del vector y creamos un archivo incluyendo el promedio
  209. void crearArchivoDesdeVector(string nombreArchivo, char caracterDeSeparacion, Persona v[], int cantidadPersonas) {
  210.     cout <<endl<<"[Creación de un archivo en base a información existente en un  vector]"<<endl;
  211.  
  212.     ofstream archivo;
  213.     archivo.open(nombreArchivo, ios::out);
  214.  
  215.     if(archivo.is_open()) {
  216.         for(int i=0; i< cantidadPersonas;i++) {
  217.             archivo << v[i].nombre << caracterDeSeparacion;
  218.             archivo << v[i].nota1  << caracterDeSeparacion;
  219.             archivo << v[i].nota2  << caracterDeSeparacion;
  220.             archivo << (float)v[i].promedio << endl;
  221.         }
  222.  
  223.         archivo.close();
  224.         cout <<"archivo creado con éxito"<<endl;
  225.     } else {
  226.         cout <<"error";
  227.     }
  228. }
Add Comment
Please, Sign In to add comment