Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: erest0r en 17 Agosto 2014, 23:55 pm



Título: Duda: ios::out e ios::ate
Publicado por: erest0r en 17 Agosto 2014, 23:55 pm
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
  1. #include <iostream>
  2. using std::cerr;
  3. using std::cin;
  4. using std::cout;
  5. using std::endl;
  6. using std::ios;
  7.  
  8. #include <fstream> // flujo de archivo
  9. using std::ofstream; // flujo de archivo de salida
  10.  
  11. #include <cstdlib>
  12. using std::exit;
  13.  
  14. int main()
  15. {
  16. // el constructor de ofstream abre el archivo
  17.    ofstream archivoClienteSalida( "clientes.dat", ios::ate ); // originalmente era ios::out y lo coloque ios::ate para probar
  18.  
  19.    // sale del programa si no puede crear el archivo
  20.    if ( !archivoClienteSalida ) // operador ! sobrecargado
  21.    {
  22.     cerr << "No se pudo abrir el archivo" << endl;
  23.     exit( 1 );
  24.    }
  25.  
  26.    cout << "Escriba la cuenta, nombre y saldo." << endl
  27.     << "Escriba fin de archivo ( Ctrl + Z ) para terminar la entrada.\n?";
  28.  
  29.    int cuenta;
  30.    char nombre[30];
  31.    double saldo;
  32.  
  33.    // lee la cuenta, nombre y saldo de cin y despues los coloca en el archivo
  34.    while ( cin >> cuenta >> nombre >> saldo )
  35.    {
  36.     archivoClienteSalida << cuenta << ' ' << nombre << ' ' << saldo << endl;
  37.     cout << "?";
  38.    }
  39.  
  40.    return 0;
  41. }
  42.  


Título: Re: Duda: ios::out e ios::ate
Publicado por: ivancea96 en 18 Agosto 2014, 00:44 am
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;".


Título: Re: Duda: ios::out e ios::ate
Publicado por: erest0r en 18 Agosto 2014, 02:02 am
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í.


Título: Re: Duda: ios::out e ios::ate
Publicado por: ivancea96 en 18 Agosto 2014, 02:45 am
Pero tal como usas en ese código ofstream, te debería servir con ios::app.


Título: Re: Duda: ios::out e ios::ate
Publicado por: erest0r en 18 Agosto 2014, 03:14 am
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


Título: Re: Duda: ios::out e ios::ate
Publicado por: ivancea96 en 18 Agosto 2014, 12:31 pm
Para que no te sobrescriba, tienes que abrir un fstream con ambas ios::out e ios::in, más el ios::ate, claro.


Título: Re: Duda: ios::out e ios::ate
Publicado por: erest0r en 18 Agosto 2014, 18:33 pm
Gracias =)