Dev - C++ - El diccionario sobreescribe el archivo de texto.

   
Vista:

El diccionario sobreescribe el archivo de texto.

Publicado por carlos (3 intervenciones) el 04/05/2015 18:54:13
Hola a todos, tengo un problema en mi código. Si existe anteriormente una palabra en el archivo de texto este se sobrescribe por la nueva. cada vez que abro el programa y agrego algo nuevo, ocurre esto.

Les dejo mi diccionario en adjuntos, según creo el problema esta en la clase dictionary en su constructor.
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

El diccionario sobreescribe el archivo de texto.

Publicado por vangodp (287 intervenciones) el 04/05/2015 23:44:16
Es por el modo de apertura de File._Writing.open(dicc, ios::out); en el destructor Dictionary::~Dictionary() del Dictionary.cpp creo.

El modo de apertura ios::out es una escritura destructiva, o sea que puedes agregar varias entradas mientras no cierre el fichero, pero cuando salgas del programa y lo ejecutes nuevamente y intentes insertar algo en el fichero automáticamente destruirá todo el contenido anterior.

Para poder seguir insertando sin destruir lo anterior debes usar alguno de los flags de apertura como append( ios::app ) o ios::ate(at end).

Uno solo permite la inserción al final(app). Así que sitúes el cursor donde sitúes cuando vaya escribir se hace siempre en la ultima linea del fichero. Ya ate es lo mismo pero ese si que permite escribir en cualquier parte del fichero, pero ojo al usar cualquier de los 2 vas a parar automáticamente al final del fichero, pero con ate (at end) puedes situarte en cualquier parte usando funciones como seekp o seekg.

Otras cosas a señalar es que si se trata de un ofstream se supone que ya es ios::out y que ademas implícitamente también lo es trunc, o sea que destruye todo el contenido del fichero al escribir, si no pones que es app/ate te va borrar todo, que supongo que es lo que te esta pasando, pero realmente si es un ofstream no necesitas poner que es ios::out ya que es ofstream =).

Al Igual le pasa con ifstream que también es ios::in, y ese se sitúa al inicio del fichero a la primera linea. se puede modificar (creo..nunca lo pruebe XD) por ejemplo poner un ofstream de salida para que sea un ios::in, a lo mejor hablo tontería pero en teoría creo que se puede.Te dejo a ti que lo pruebes. XDD

Ambos ios::in y ios::out se usan para cuando es filedescriptor de entrada y salida a la vez como puede ser fstream, en ese caso sí que se deberia usar ios::out y ios::in para decir explícitamente si vas leer o escribir o incluso ambos a la vez aun que no se si se es obligado a hacer ya que se trata de un fichero de lectura y escritura a la vez, aun así no hace daño poner eso ya que para ti será más claro.

Entonces...:

ofstream f; /*f es un puntero/descriptor de archivo de salida, se situá al final, no necesitas poner ios::out por que se supone que ya es de salida, pero no hace daño tampoco que pongas, creo que le puedes hacer que lea también con ios::in aun que no veo sentido a eso ya que mejor usas fstream para ello. Importante es que es de escritura destructiva destructiva(ios::trunc) si no se indica explícitamente que es ios::app o ios::ate*/

ifstream f; /* ahora f es un puntero/descriptor de archivo de entrada, se situá al inicio para leer, no necesitas poner ios::in ya que se supone que es de entrada, creo que puedes hacer que escriba con ios::out pero tampoco le veo sentido ya que tienes fstream mejor*/

ios::app solo agrega contenido al final del fichero... Aun que lleves el cursor al inicio y intentes escribir, la escritura se hace al final, entonces das por buena opción para añadir contenidos al fichero ya que garantiza que no se borrará nada ya que siempre escribe al final.

ios::ate es más flexible ya que permite escribir en cualquier parte del fichero, pero al igual que app al iniciar esta al final del fichero, pero con ate depende de ti manejar el cursor con seekg(seekget) o seekp(seekput) para hacer la escritura en la posición correcta(cuidado no liar XD).

fstream f; //f es tanto para leer como para escribir se supone que es tanto ios::in como ios::out, no tengo idea donde iniciar el cursor así que cuidado. También es bueno informar explícitamente si es ios::in o out, trunc o app/ate, aparte de si el fichero es del tipo binario(ios::binary), si no pones ios::binary es tipo texto plano.

Para más información: http://www.cplusplus.com/reference/ios/ios_base/openmode/

Si el problema no era ese pues dime cual es... es que solo dices que tienes un problema pero no lo explicas.

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

El diccionario sobreescribe el archivo de texto.

Publicado por carlos (3 intervenciones) el 06/05/2015 01:15:54
Solucionado! Gracias, use ate, debido a que app duplicaba.
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