Duda: ios::out e ios::ate

Iniciado por erest0r, 17 Agosto 2014, 23:55 PM

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

erest0r

Hola, estoy algo confuso con esos 2 modos, por lo que leí ios::out crea un archivo en modo salida, y si existe lo sobrescribe, ios::ate abre un archivo en modo salida y se desplaza al final del archivo pero se puede mover a través de él, pero tengo este código de practica que estuve leyendo e ios::ate borra todo lo existia en el archivo

Código (cpp) [Seleccionar]

#include <iostream>
using std::cerr;
using std::cin;
using std::cout;
using std::endl;
using std::ios;

#include <fstream> // flujo de archivo
using std::ofstream; // flujo de archivo de salida

#include <cstdlib>
using std::exit;

int main()
{
// el constructor de ofstream abre el archivo
    ofstream archivoClienteSalida( "clientes.dat", ios::ate ); // originalmente era ios::out y lo coloque ios::ate para probar

    // sale del programa si no puede crear el archivo
    if ( !archivoClienteSalida ) // operador ! sobrecargado
    {
    cerr << "No se pudo abrir el archivo" << endl;
    exit( 1 );
    }

    cout << "Escriba la cuenta, nombre y saldo." << endl
    << "Escriba fin de archivo ( Ctrl + Z ) para terminar la entrada.\n?";

    int cuenta;
    char nombre[30];
    double saldo;

    // lee la cuenta, nombre y saldo de cin y despues los coloca en el archivo
    while ( cin >> cuenta >> nombre >> saldo )
    {
    archivoClienteSalida << cuenta << ' ' << nombre << ' ' << saldo << endl;
    cout << "?";
    }

    return 0;
}
Cruzar la calle junto a mucha gente cuando el semáforo sigue en rojo da seguridad y espíritu de equipo... o cruzamos todos o morimos juntos.

ivancea96

#1
en vez de "ate" usa "ios::app". A ver si te va.

Por cierto, que veo que pones muchos "using". Te llega con poner "using namespace std;".

erest0r

ios::app sí almacena los datos al final del archivo, pero siempre lo hace al final por lo que he leído, en cambio ios::ate debería moverse a través de este y agregar los datos en cualquier parte.

Lo del exceso de "using" es por como había dicho anteriormente, era un código de practica que leí.
Cruzar la calle junto a mucha gente cuando el semáforo sigue en rojo da seguridad y espíritu de equipo... o cruzamos todos o morimos juntos.

ivancea96

Pero tal como usas en ese código ofstream, te debería servir con ios::app.

erest0r

#4
Sí, pero el punto es que, ¿ si uso ios::ate, no debería posicionarse al final sin sobrescribir el contenido?




O saber el equivalente al modo "r+" de la función fopen en C, ya que ios::app funcionaria como "a+", y pensé que ios::ate funcionaria como "r+", perro viendo como funciona ese código veo que no, o quizás me esta faltando algo
Cruzar la calle junto a mucha gente cuando el semáforo sigue en rojo da seguridad y espíritu de equipo... o cruzamos todos o morimos juntos.

ivancea96

Para que no te sobrescriba, tienes que abrir un fstream con ambas ios::out e ios::in, más el ios::ate, claro.

erest0r

Cruzar la calle junto a mucha gente cuando el semáforo sigue en rojo da seguridad y espíritu de equipo... o cruzamos todos o morimos juntos.