Autor
|
Tema: Problema abrir archivo (Leído 3,114 veces)
|
Kaxperday
Desconectado
Mensajes: 702
The man in the Middle
|
Hola, no entiendo porque si abro el archivo en modo escritura y lectura a la vez, no puedo hacer ambas cosas a la vez, sino que tengo que cerrarlo y volverlo a abrir. fstream archivo; archivo.open(directorio, fstream::in | fstream::out); if (!archivo) return false; else{ string contenido; while (archivo.good()){ contenido += archivo.get(); } //archivo.close(); //archivo.open(directorio, fstream::out || fstream::ate); //contenido = contenido.insert(inicio, datos); //archivo.write(contenido.c_str(), contenido.length()); archivo.seekp(inicio); archivo.write(datos.c_str(), datos.length()); archivo.close();
Este code no funciona, lo que quiero hacer es leer todo el archivo e insertar datos en el archivo, pero no hay manera, parece que despues de leerlo tengo que cerrarlo y abrirlo en escritura para escribir en el, ¿esto es siempre asi? ¿o hago algo mal? Saludos.
|
|
|
En línea
|
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
Desconectado
Mensajes: 3.412
ASMático
|
Al acabar el while, las flags del objeto serán de error. Lo que has de hacer, es llamar a archivo.clear() al final de la lectura.
|
|
|
En línea
|
|
|
|
Kaxperday
Desconectado
Mensajes: 702
The man in the Middle
|
Así es, ya lo solucioné gracias por la respuesta, de todas formas al leer el contenido del archivo, aqui: string contenido; while (archivo.good()){ contenido += archivo.get(); }
Me preguntaba si se puede hacer de forma más rápida usando archivo.read(contenido, HASTA EL FINAL); Simplemente por si es más rápido, en vez de caracter a caracter. Saludos.
|
|
|
En línea
|
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
Desconectado
Mensajes: 3.412
ASMático
|
Lo mejor sería que usaras istream::read(). Luego, con istream::gcount() sacas el número caracteres copiados al array Y ya luego, lo puedes convertir a string, tú verás. Tal vez te interese primero saber el tamaño del fichero con ios::ate y tellg().
|
|
|
En línea
|
|
|
|
Kaxperday
Desconectado
Mensajes: 702
The man in the Middle
|
Hola, tenía otro problema, y es que quería insertar en el archivo una cadena en mitad de su contenido, para ello probé a usar esto: fstream archivo; archivo.open(directorio, fstream::in | fstream::app);//fstream::out | archivo.clear(); archivo.seekp(inicio); archivo.write(datos.c_str(), datos.length());//sobreescribe. archivo.close();
Muevo el puntero, a "inicio" donde quiero insertar una cadena de carácteres, para ello uso write, pero el problema es que el write me sobreescribe lo que tengo, y corrompe el archivo, lo que quiero es poderlo añadir, sin que haya sobreescritura, he probado a abrirlo solo en modo app (con el puntero atrás), pero luego al usar el seekp() no debe de funcionar ya que me escribe la cadena al final del archivo aunque haya movido el puntero supuestamente, si no hay manera de corregirlo, apuesto apostaré por leer todo el contenido en una string insertar en la string y copiarlo todo al archivo sorbrescribiendolo, pero sería la peor solución. Saludos y gracias.
|
|
|
En línea
|
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
Desconectado
Mensajes: 3.412
ASMático
|
ios::app = append. Lo pone al final.
Lo que tienes que hacer es dividir el archivo en 2 por el punto donde queires insertar. Lees y guardas la segunda parte en la memoria del programa. Insertas lo que quieras. Reescribes la segunda parte al final de la inserción.
|
|
|
En línea
|
|
|
|
Kaxperday
Desconectado
Mensajes: 702
The man in the Middle
|
Hola socio, gracias por la respuesta. Eso pensé también, pero de todas formas lo que haces es sobreescribir pero desde el punto que quieras hacia atrás, pensaba que habría alguna opción para insertar y que automaticamente te lo desplace todo, en vez de sobreescritura. Porque si quiero escribir en la posicion 10 "holaquetal" y el archivo tiene 1500 caracteres, voy a tener que reescribir 1500 + strlen("holaquetal") en vez de insertar. Debería de haber algo para C++, de todas formas tampoco sería difícil implementar una función que lo haga. Pero para eso, casi que lo leo todo en una cadena, la modifico y lo escribo todo, o como dices tu que sería un poco mas de código. Saludos y gracias. Edito: E aquí la implementación: datos = datos + contenido.substr(inicio); archivo.clear(); archivo.seekp(inicio); archivo.write(datos.c_str(), datos.length()); archivo.close();
|
|
« Última modificación: 18 Agosto 2015, 18:00 pm por Kaxperday »
|
En línea
|
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Problema al abrir alguan archivo AVI
Multimedia
|
KmU_HmO
|
6
|
2,854
|
4 Agosto 2005, 20:33 pm
por Songoku
|
|
|
problema al abrir archivo
Programación C/C++
|
m@o_614
|
1
|
2,077
|
5 Diciembre 2013, 04:22 am
por vangodp
|
|
|
Problema al abrir un archivo .log
Software
|
juanmarojinegro
|
0
|
1,313
|
18 Febrero 2014, 21:23 pm
por juanmarojinegro
|
|
|
Problema al abrir archivo en GEDIT <<<<<<<<<<<<<<<<<!
Programación C/C++
|
ProgramadorAlvaro
|
0
|
1,741
|
10 Diciembre 2015, 22:14 pm
por ProgramadorAlvaro
|
|
|
Problema abrir archivo solicitando el nombre
Scripting
|
yukardo
|
2
|
1,934
|
22 Septiembre 2016, 20:42 pm
por tincopasan
|
|