Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /**DAVID CASTRO - UTEM 20200922 - EDD 2020-02**/
- #include <iostream>
- #include <fstream>
- #include <vector>
- #include <sstream>
- using namespace std;
- struct Persona{
- string nombre;
- int nota1;
- int nota2;
- float promedio;
- };
- /** Para el caso vectores muy grandes utilizaremos una variable global**/
- Persona vectorPersonas[5];
- /**Prototipos de funciones**/
- void crearArchivoConDatosDePrueba(string, char);
- void leerArchivoSimple(string);
- void leerArchivoSeparadosPorCaracter(string, char);
- void leerArchivoSeparadosPorCaracterYDejarEnVector(string, char, Persona v[], int &);
- void crearArchivoDesdeVector(string, char, Persona v[], int);
- //Programa principal
- int main() {
- //esta línea nos permite utilizar tíldes
- setlocale(LC_CTYPE,"Spanish");
- string nombreArchivo = "misdatos.csv";
- /**PASO 1: creamos el archivo con datos aleatorios **/
- crearArchivoConDatosDePrueba(nombreArchivo, ';');
- /**PASO 2: leemos el archivo y lo mostrarmos de forma simple (línea a línea)**/
- leerArchivoSimple(nombreArchivo);
- /**PASO 3: leemos el archivo y lo obtenemos una línea, pero luego,
- esa línea, la volvemos a separar en base al caracter indicado**/
- leerArchivoSeparadosPorCaracter(nombreArchivo, ';');
- /**PASO 4: leemos el archivo y lo obtenemos una línea, pero luego,
- esa línea, la volvemos a separar en base al caracter indicado
- y además volcamos esa información a un vector de tipo persona **/
- int cantidadPersonas = 0; //esta variable retornará la cantidad de personas leídas en el archivo
- leerArchivoSeparadosPorCaracterYDejarEnVector(nombreArchivo, ';', vectorPersonas, cantidadPersonas );
- cout <<"Se han leído "<<cantidadPersonas<<" desde el archivo"<<endl;
- /**PASO 5: tomamos la información existente en el vector la volcamos a un archivo de texto separado por tabuladores**/
- crearArchivoDesdeVector("ArchivoSeparadoPorTab.txt", '\t', vectorPersonas, cantidadPersonas);
- }
- void crearArchivoConDatosDePrueba(string nombreArchivo, char caracterDeSeparacion) {
- /**utilizamos una variable de tipo ofstream**/
- ofstream archivo;
- /**abrimos el archivo , "ios::out" Sólo salida de información **/
- archivo.open(nombreArchivo, ios::out);
- //para ejemplo utilizamos un vector con datos
- Persona datos[5];
- datos[0].nombre = "David";
- datos[0].nota1 = 7;
- datos[0].nota2 = 6;
- datos[1].nombre = "Lucia";
- datos[1].nota1 = 4;
- datos[1].nota2 = 7;
- datos[2].nombre = "Diego";
- datos[2].nota1 = 3;
- datos[2].nota2 = 4;
- datos[3].nombre = "Maria";
- datos[3].nota1 = 7;
- datos[3].nota2 = 4;
- datos[4].nombre = "Jorge";
- datos[4].nota1 = 1;
- datos[4].nota2 = 4;
- if(archivo.is_open()) {
- /**creamos el archivo con los datos el vector separamos por el caracter indicado en la funcion**/
- for(int i=0; i< 5;i++)
- archivo <<datos[i].nombre << caracterDeSeparacion << datos[i].nota1 << caracterDeSeparacion << datos[i].nota2<<endl;
- //cerramos el archivo
- archivo.close();
- cout <<"archivo creado con éxito"<<endl;
- } else {
- cout <<"error";
- }
- }
- /**Esta función permite mostrar un archivo línea a linea**/
- void leerArchivoSimple(string nombreArchivo){
- ifstream archivo;
- //ios::in >> sólo lectura
- archivo.open(nombreArchivo.c_str(), ios::in);
- cout <<"[Mostrar archivo simple: linea a línea]"<<endl;
- //pregunta si se pudo abrir el archivo
- if(archivo.is_open()){
- //creamos un variable para guardar las líneas obtenidos del archivo
- string linea;
- //recorre las líneas del archivo y las deja en la variable linea
- while (getline(archivo, linea)){
- cout <<linea<<endl;
- }
- } else {
- cout << "Error en la apertura del archivo "+nombreArchivo;
- }
- }
- void leerArchivoSeparadosPorCaracter(string nombreArchivo, char caracterDeSeparacion){
- cout <<endl<<"[Leer archivo y separar linea obtenida por partes]"<<endl;
- ifstream archivo;
- archivo.open(nombreArchivo.c_str(), ios::in);
- if(archivo.is_open()){
- string linea;
- while (getline(archivo, linea)){
- /**creamos la variable ss que un formato similar a la lectura del archivo**/
- stringstream ss(linea);
- /**variable temp para obtener la separacion por el caracter**/
- string temp;
- /**creamos una variable items que contendrá los elementos de cada línea separados por el caracter indicado**/
- vector<string> items;
- /**recorremos la linea obtenida y la separamos por el caracter indicado**/
- while (getline(ss, temp, caracterDeSeparacion))
- items.push_back(temp); //la dejamos en un vector de items
- /**una vez que separamos por items, los podemos ocupar por separado**/
- string nombre = items[0];
- /** utilizamos .c_str() para transformar un string a una vector de caracteres**/
- /** utilizamos la funcion atoi para transformar un vector de caracteres a número**/
- int nota1 = atoi(items[1].c_str());
- int nota2 = atoi(items[2].c_str());
- float promedio = (float)(nota1 + nota2)/ 2;
- cout <<"nombre: "<<nombre;
- cout <<", nota1: "<<nota1;
- cout <<", nota2: "<<nota2;
- cout <<", promedio: "<<promedio<<endl;
- }
- } else {
- cout << "Error en la apertura del archivo "+nombreArchivo;
- }
- }
- /**procesamos el archivo y lo volcamos sobre un vector**/
- void leerArchivoSeparadosPorCaracterYDejarEnVector(string nombreArchivo, char caracterDeSeparacion, Persona v[], int &cantidadPersonas){
- cout <<endl<<"[Leer archivo y separar linea obtenida por partes y volcar a un vector]"<<endl;
- ifstream archivo;
- archivo.open(nombreArchivo.c_str(), ios::in);
- //inicializamos la variable, para luego incrementarla
- cantidadPersonas = 0;
- if(archivo.is_open()){
- string linea;
- while (getline(archivo, linea)){
- /**creamos la variable ss que un formato similar a la lectura del archivo**/
- stringstream ss(linea);
- /**variable temp para obtener la separacion por el caracter**/
- string temp;
- /**creamos una variable items que contendrá los elementos de cada línea separados por el caracter indicado**/
- vector<string> items;
- /**recorremos la linea obtenida y la separamos por el caracter indicado**/
- while (getline(ss, temp, caracterDeSeparacion))
- items.push_back(temp); //la dejamos en un vector de items
- /**una vez que separamos por items, los podemos ocupar por separado**/
- string nombre = items[0];
- /** utilizamos .c_str() para transformar un string a una vector de caracteres**/
- /** utilizamos la funcion atoi para transformar un vector de caracteres a número**/
- int nota1 = atoi(items[1].c_str());
- int nota2 = atoi(items[2].c_str());
- float promedio = (float)(nota1 + nota2)/ 2;
- v[cantidadPersonas].nombre = nombre;
- v[cantidadPersonas].nota1 = nota1;
- v[cantidadPersonas].nota2 = nota2;
- v[cantidadPersonas].promedio = promedio;
- //incrementamos la cantidad de personas
- cantidadPersonas++;
- }
- cout <<"***Archivo correctamente procesado"<<endl;
- } else {
- cout << "Error en la apertura del archivo "+nombreArchivo;
- }
- }
- //tomamos la información del vector y creamos un archivo incluyendo el promedio
- void crearArchivoDesdeVector(string nombreArchivo, char caracterDeSeparacion, Persona v[], int cantidadPersonas) {
- cout <<endl<<"[Creación de un archivo en base a información existente en un vector]"<<endl;
- ofstream archivo;
- archivo.open(nombreArchivo, ios::out);
- if(archivo.is_open()) {
- for(int i=0; i< cantidadPersonas;i++) {
- archivo << v[i].nombre << caracterDeSeparacion;
- archivo << v[i].nota1 << caracterDeSeparacion;
- archivo << v[i].nota2 << caracterDeSeparacion;
- archivo << (float)v[i].promedio << endl;
- }
- archivo.close();
- cout <<"archivo creado con éxito"<<endl;
- } else {
- cout <<"error";
- }
- }
Add Comment
Please, Sign In to add comment