Mejor clase para trabajar con archivos C++

Iniciado por Kaxperday, 11 Agosto 2015, 22:04 PM

0 Miembros y 1 Visitante están viendo este tema.

Kaxperday

Hola, necesito trabajar con ficheros para escribir y leer datos, hacer ambas cosas a la vez en una misma función vaya.

Tenía pensado usar FILE como hacía para C, pero sería una incoherencia debido a que estoy usando C++, y estaría dejando atrás los métodos que ofrecen sus funciones.

Mi pregunta es, que debo hacer ¿crear un ifstream para leerlo, liberarlo y crear luego un ofstream para escribir en el?. No creo que sea haga así.

¿No hay una clase, que maneje archivos con métodos de lectura y escritura? Es lo que busco.

Edito: Acabo de leer acerca de fstream, y creo que es lo que busco, lo inicializaría de esta manera:

fstream fs("test.txt", fstream::in | fstream::out);

Parece tener métodos de lectura y escritura, aun no lo he probado, ¿me lo recomendáis? ¿o hay algo mejor?.

La función debe de leer todo el archivo y luego sobrescribir unas líneas.

¡Saludos!.
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.

Seyro97

Personalmente siempre he usado el método de C (La de la estructura FILE). Para mí es una manera muy sencilla de trabajar y nunca he tenido problemas usándolo. Por eso mismo, a riesgo de que sea peor (cosa que dudo), te recomiendo que sigas usando la estructura FILE. Si opinan lo contrario, no duden en argumentar!
Carlos Peláez González. visita http://www.taringa.net/EnjoyC para muchos tutoriales!

ivancea96

Cita de: Seyro97 en 12 Agosto 2015, 21:10 PM
Personalmente siempre he usado el método de C (La de la estructura FILE). Para mí es una manera muy sencilla de trabajar y nunca he tenido problemas usándolo. Por eso mismo, a riesgo de que sea peor (cosa que dudo), te recomiendo que sigas usando la estructura FILE. Si opinan lo contrario, no duden en argumentar!

fstream es mejor para C++, por varias razones: para empezar, tiene la misma funcionalidad que FILE, pero más simple. Es una clase, que hereda de istream/ostream, con lo que puedes utilizar herencia.

Realmrnte son suficientes razones para usarlo si programas C++. Argumentos basados en costumbres de C, no sirven.
No conozco razón que haga fstream, ifstream u ofstream peores que FILE. ¿Conoces alguna?

Kaxperday

Hola, la verdad siempre trabaje muy bien con FILE, pero eso quedo en C, además al compilar en C++ con file dice que no es muy seguro, salta una alerta y hay que añadir una directiva al preprocesador.

Dicho esto, estoy usando fstream y la verdad va muy bien, el único problema que tengo es como saber si el archivo existe o no, podría hacer fopen(archivo, "rt"), pero preferiría usar un método de fstream, pero al parecer no tiene.

¿A alguien se le ocurre que puedo hacer?, estoy probando con fstream.is_open(), es lo más parecido que hay, pero parece no funcionar.

Saludos.
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.

ivancea96

O puedes utilizar
Código (cpp) [Seleccionar]
if(file.fail()) // error

Kaxperday

Buenas socio, he probado con archivo.open() si devuelve false es que no lo pudo abrir, aunque quizás si exista, con fail() pasará lo mismo, o realmente dirá si existe o no? Me pregunto, gracias. De todas formas lo probare.

Saludos.
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.

ivancea96

Código (cpp) [Seleccionar]
#include <iostream>
#include <fstream>

using namespace std;

int main(){
    ifstream a("inexistent.txt");
    cout << "fail " << a.fail() << endl;
    cout << "good " << a.good() << endl;
    cout << "is_open " << a.is_open() << endl;
    cout << "operator bool " << (bool)a << endl;
}


Y la salida es la esperada:

Citarfail 1
good 0
is_open 0
operator bool 0

En caso de que exista:
Citarfail 0
good 1
is_open 1
operator bool 1

Kaxperday

Okay gracias, está bastante aclarado. Supongo que solo comprueba si existe no hace nada de abrirlo o así, así que despues de la llamada a esa función en el caso de que sí exista no se encontrará abierto no?, de todas formas si llamo a close() tampoco habrá problemas, pero no creo que sea necesario.

Saludos  ;D
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.