Dev - C++ - Añadir datos a fichero de texto C++

   
Vista:

Añadir datos a fichero de texto C++

Publicado por Jose Manuel (30 intervenciones) el 14/11/2014 12:08:01
Bueno, seguro que es una tontería, pero no consigo algo tan simple como esto.

Para abreviar, decir que si, los ficheros están en el mismo directorio, los nombres son correctos, el programa no me da ningún error ni aviso de compilación, etc...

La parte "critica"

1
2
3
4
5
6
7
8
9
10
11
12
void crea_file(string nombre, string correo){
   ofstream fout (nombre.c_str());
   fout << correo << endl;
   fout.close();
   }
 
void Mas_datos(string nombre, string correo){
    fstream fs;
    fs.open(nombre.c_str(), ios::app);
    fs << correo << endl;
    fs.close();
}

He comprobado que el flujo del programa llega correctamente a las acciones correspondientes, los datos que llegan, son correctos, y la primera acción funciona sin el mas mínimo problema.

Pero, a la hora de añadir nuevos datos a un fichero ya creado, la segunda función no hace nada. La función es llamada cuando toca (eso ya lo he comprobado), los datos que recibe son correctos (también comprobado) pero simplemente, no añade nada en los mismos.

Estoy seguro de que es una tontería, pero no consigo encontrar donde tengo el problema, a ver si me podéis echar una mano
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de vangodp

Añadir datos a fichero de texto C++

Publicado por vangodp (287 intervenciones) el 14/11/2014 17:27:33
Eso es por que los trunca.
Para eso debes usar los modos de apertura.
Son unos flags que pasas como parametro a la hora de crear la variable fin, fs etcetc

aqui te dejo un ejemplo pero recuerda esto...
Como llamas a ambas funciones tuya antes... cada vez te va "truncar" el archivo. Truncar es borrar el contenido ;)
Para que no te trunque debes comentar las llamadas a las funciones createFile() y add() de micodigo. Mejor es trabajar solo con la funcion fio() que hace 3 trabajos. 1º crea el archivo 2º si el archivo ya existe no lo trunc, solo añade contenido al final gracias al flag app y 3º muestra el contenido.

te paso el codigo ya comentado. Pero si quieres activar las funciones createFile y add es solo quitar los // de adelante.

http://codepad.org/tgevvU9F
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include <iostream>
#include <fstream>
using namespace std;
 
void createFile( string fichero, string unString ){
    ofstream fileOut ( fichero.c_str());
    fileOut << unString << endl;
    fileOut.close();
}
 
void add( string fichero, string unString ){
    fstream fileAdd;
    fileAdd.open( fichero.c_str(), ios::app);
    fileAdd << unString << endl;
    fileAdd.close();
}
 
//3ª opcion escribe y lee a la vez
void fio( string nombreFichero, string unString = "" ){
    //Creo un fichero tanto para leer como para escribir. Si ya existe el fichero solo añade mas informacion al fichero existente.
    //los flags son:
    //fstream::in       habilita la lectura del fichero
    //fstream::out      habilita la escritura en el fichero
    //fstream::app      permite añadir contenido al final del fichero
    //fstream::trunc    borra siempre el contenido del fichero al escribir en el (no compatible con fstream::app)
    //fstream::binary   habilita la creacion y modificacion de ficheros binarios ( los .dat por ejemplo)
    //fstream::ate      inicia la salida en el fil del fichero
    //Los flags deben ir separado por | y no por coma
    //para mas informacion sobre los modos de apertura de un fichero mire en http://www.cplusplus.com/reference/fstream/fstream/open/
    fstream fichero ( nombreFichero.c_str(), fstream::in | fstream::out | fstream::app );
 
    if ( unString == "" ) {
        while ( getline( fichero, unString ) ) {
            cout << unString << endl;
 
        }
    }else if ( unString != "" ){
        fichero << unString << endl;
    }
    fichero.close();
}
 
int main (){
    //crea el fichero
    //createFile("datos.txt", "Hola mundo!");  // <---quite los // para ver como se porta con tus funciones. Veras que te trunca el archivo
    cout << endl << endl;
 
    //agrega datos en el
    //add( "datos.txt", "Hello world!" );// <---quite los // para ver como se porta con tus funciones.
    cout << endl << endl;
 
    //la funcion fio() tiene ambas funciones... Lectura y escritura.
    //si la llamamos sin pasar un segundo argumento va leer lo que haya escripto en el fichero
    cout << "Antes tenia:" <<endl;
    fio("datos.txt");
    cout << endl << endl;
 
    //si le pasamos un string como segundo argumento eso quiere decir que lo que queremos es añadir texto, eso es justo lo que va hacer
    fio("datos.txt", "Añadimos algo mas");
    cout << endl << endl;
 
    cout << "ahora tiene:" <<endl;
    //volvemos a leer (sin pasar segundo argumento ;) )
    fio("datos.txt");
 
 
    cin.ignore();
    return 0;
}

mire esos videos que te explica:
http://v1.minidosis.org/C++/Entrada-Salida/Leer%20de%20un%20Fichero/
http://v1.minidosis.org/C++/Entrada-Salida/Escribir%20en%20un%20Fichero/
http://v1.minidosis.org/C++/Entrada-Salida/Modos%20de%20Apertura/
El ultimo es el que te interesa.

Suerte
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Añadir datos a fichero de texto C++

Publicado por Jose Manuel (30 intervenciones) el 14/11/2014 17:57:58
Gracias, lo he hecho funcionar con el ios::out que comentan mas abajo, pero le daré un repaso completo a la opción que me comentas, nunca esta de mas conocer mas cosas
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Añadir datos a fichero de texto C++

Publicado por Martín (65 intervenciones) el 14/11/2014 17:36:00
Si estás compilando con el estándar C++98, deberías indicar que abres el archivo para escritura:
1
fs.open(nombre.c_str(), ios::out | ios::app);


En C++11 debería funcionar sin más.

Martín;
Tutorías privadas de C++
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Añadir datos a fichero de texto C++

Publicado por Jose Manuel (30 intervenciones) el 14/11/2014 17:57:20
Exacto... eso es lo que me faltaba, el ios::out. Gracias mil
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar