Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: ciquee en 25 Abril 2019, 11:42 AM

Título: Reemplazar información de un fichero
Publicado por: ciquee en 25 Abril 2019, 11:42 AM
Buenas compañeros/as!

Necesito ayuda porque estoy bloqueado con el tema ficheros.
Tengo un archivo (notas.dat) con nombres de alumnos y notas, y necesito anonimizar el fichero, es decir, sustituir los nombres de los alumnos por "Alumno 1"... y guardar la información en otro nuevo fichero.

Yo sé abrir ficheros para leer y para escribir, pero no tengo ni idea de como identificar el nombre de los alumnos para sustituirlos.

Por otro lado también necesito trabajar con esas notas para calcular la mas alta, la mas baja y la media...

Para la realización de estos ejercicios NO puedo usar funciones o procedimientos auxiliares, ni la utilización de datos estructurados (cadenas, registros, vectores o matrices)

¿Me podéis guiar un poquito? Muchas gracias!
Título: Re: Reemplazar información de un fichero
Publicado por: K-YreX en 25 Abril 2019, 15:08 PM
Los ficheros son de lectura/escritura por lo que para trabajar con los datos debes guardar esos datos en variables. Para ello debes conoces la estructura que tiene el fichero.
Imagina que el fichero tiene la siguiente estructura:

Nombre Nota

Vamos a dividir el problema en dos partes:
Título: Re: Reemplazar información de un fichero
Publicado por: ciquee en 27 Abril 2019, 13:12 PM
Muchas gracias YreX-DwX!

He estado dandole vueltas a tu solución, pero creo que aún soy muy malo en esto del C++ porque no me aclaro. Aunque pienso que debe haber una forma más fácil, me explico, que la otra vez no me explique muy bien. El fichero ue tengo es del tipo:

Nombre alumno 1   Pepito Pérez
nota_alumno_1      5.8
Nombre alumno 2   Juan Gómez
nota_alumno_2      3.3
...               ...
Nombre alumno n   Mauricio Colmenero
nota_alumno_n      8.2

Con lo cual bastaría con leer linea a linea y copiar en otro archivo solo las lineas pares ¿no crees? pero no tengo ni idea de como hacerlo. A ver si me puedes orientar por favor! Este es el código que tengo por ahora...


#include <iostream>
#include <fstream>
#include <stdlib.h>

using namespace std;

int main(void) {
ofstream archivo;


archivo.open("notas.dat",ios::out);

if(archivo.fail()){
cout<<"No se pudo abrir el archivo";
exit(1);
}

while (!archivo.EOF())
{


}

archivo.close();
}


Saludos! y Buen finde!
Título: Re: Reemplazar información de un fichero
Publicado por: K-YreX en 27 Abril 2019, 15:40 PM
Claro a ver, todo depende de cuál quieras que sea el resultado. Pongamos el supuesto de ejemplo que has comentado tú:

Nombre alumno 1   Pepito Pérez
nota_alumno_1      5.8
Nombre alumno 2   Juan Gómez
nota_alumno_2      3.3
...               ...
Nombre alumno n   Mauricio Colmenero
nota_alumno_n      8.2

Supongo que "Nombre alumno n" no va con _ (lo cuál sería más fácil de leer todo el bloque junto).

Título: Re: Reemplazar información de un fichero
Publicado por: ciquee en 3 Mayo 2019, 21:12 PM
Buenas YreX-DwX!!

Nada, que tengo un cloqueo con esto de los ficheros o archivos...

He resuelto el primer problema, porque se que getline lee una linea entera y la puedo guardar en una variable y ya operar con ella. Aunque igual no lo he hecho de la manera más eficaz, el programa consigue lo que me piden, elimino las lineas impares y me quedo con las pares:


int main(void) {
string linea;
ifstream archivo1;
ofstream archivo2;

archivo1.open ("notas.dat");
archivo2.open ("notas_sin_nombre.dat");

if(!archivo1)
cout<<"No se pudo abrir el archivo"<<endl;
else
{
while (!archivo1.eof())
{
getline(archivo1, linea);
getline(archivo1, linea);
archivo2<< linea << endl;
}
}

archivo1.close();
archivo2.close();

return 0;
}



Y, sí, en las lineas pares va todo junto: "Nombre_alumno_n" ¿porque es más fácil así? ilumíname porfa!

Y respecto al ejercicio 2 por más vueltas que le dé no consigo hacer nada, porque el problema lo tengo en que no se como sacar los datos del fichero para poder operar con ellos. Sé que getline lee una linea entera, también sé leer y copiar todo el contenido del fichero, y que  con .seekg(pos) puedo leer una posición concreta (pero un solo carácter). Pero ¿cómo puedo sacar esas notas concretas 5.8, 3.3 y 8.2 para guardarlos en float? ayúdame por favor! O dime si no se hace así y estoy demasiado perdido!!

Muchas gracias de antemano!
Saludos!
Título: Re: Reemplazar información de un fichero
Publicado por: K-YreX en 4 Mayo 2019, 03:14 AM
Muy bien, vamos por partes.
Título: Re: Reemplazar información de un fichero
Publicado por: ciquee en 4 Mayo 2019, 21:38 PM
Muchísimas gracias por tu explicación, es genial y está muy bien argumentaba!

Lo conseguí!! y lo mejor de todo... aprendí algo nuevo!

Un saludo!
Título: Re: Reemplazar información de un fichero
Publicado por: ciquee en 5 Mayo 2019, 10:52 AM
Y una pregunta más, si el dato que tengo que extraer está en medio de muchos otros ¿he de ir guardando todos los datos en la "variable vertedero" hasta llegar al dato que quiero? Me explico, tengo un fichero con varios datos sobre estrellas...

Nombre de la estrella 1            Alfa Centauri
Distancia a la tierra (en años luz)      4.367
Radio (en Radios solares)            1.2
Masa (en kg)                  2.167e30
Magnitud absoluta               15.49
Temperatura (en Kelvin)             5790
...

Para coger el dato del nombre y la masa de cada una de las estrellas, debería descartar palabra por palabra las 5 primeras hasta llegar al nombre de la estrella, y luego descartar las 2 lineas siguientes y otras 3 palabras mas para llegar al dato de la masa? ¿O hay otra forma de hacerlo más directa y corta?

Sigo sin poder hacer uso ni de funciones o procedimientos auxiliares, ni utilizar datos estructurados (cadenas, registros, vectores o matrices).

Saludos y gracias de antemano!

Título: Re: Reemplazar información de un fichero
Publicado por: K-YreX en 5 Mayo 2019, 15:01 PM
Diría que sí, tienes que ir pasando por todas las palabras mediante una variable "vertedero" (al final se le va a quedar ese nombre :xD)
Porque para trabajar con ficheros de acceso aleatorio tienes que saber moverte en un fichero binario calculando los Bytes por los que quieres pasar.Te recomiendo usar acceso secuencial mejor.
Título: Re: Reemplazar información de un fichero
Publicado por: ciquee en 6 Mayo 2019, 01:17 AM
Ok! Pues muchas gracias de nuevo!

Seguimos!