Problema abrir archivo

Iniciado por Kaxperday, 15 Agosto 2015, 19:16 PM

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

Kaxperday

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.

Código (cpp) [Seleccionar]
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.
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

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.

Kaxperday

Así es, ya lo solucioné gracias por la respuesta, de todas formas al leer el contenido del archivo, aqui:

Código (cpp) [Seleccionar]
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.
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

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().

Kaxperday

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:

Código (cpp) [Seleccionar]

               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.
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

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.

Kaxperday

#6
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:

Código (cpp) [Seleccionar]
datos = datos + contenido.substr(inicio);
archivo.clear();
archivo.seekp(inicio);
archivo.write(datos.c_str(), datos.length());
archivo.close();


Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.