Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Kaxperday en 15 Agosto 2015, 19:16 pm



Título: Problema abrir archivo
Publicado por: Kaxperday en 15 Agosto 2015, 19:16 pm
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
  1. fstream archivo;
  2. archivo.open(directorio, fstream::in | fstream::out);
  3. if (!archivo)
  4. return false;
  5. else{
  6. string contenido;
  7. while (archivo.good()){
  8. contenido += archivo.get();
  9. }
  10.  
  11. //archivo.close();
  12. //archivo.open(directorio, fstream::out || fstream::ate);
  13. //contenido = contenido.insert(inicio, datos);
  14. //archivo.write(contenido.c_str(), contenido.length());
  15. archivo.seekp(inicio);
  16. archivo.write(datos.c_str(), datos.length());
  17. 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.


Título: Re: Problema abrir archivo
Publicado por: ivancea96 en 15 Agosto 2015, 19:44 pm
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.


Título: Re: Problema abrir archivo
Publicado por: Kaxperday en 15 Agosto 2015, 20:11 pm
Así es, ya lo solucioné gracias por la respuesta, de todas formas al leer el contenido del archivo, aqui:

Código
  1. string contenido;
  2. while (archivo.good()){
  3. contenido += archivo.get();
  4. }

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.


Título: Re: Problema abrir archivo
Publicado por: ivancea96 en 15 Agosto 2015, 21:25 pm
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().


Título: Re: Problema abrir archivo
Publicado por: Kaxperday en 17 Agosto 2015, 16:43 pm
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
  1.                fstream archivo;
  2.        archivo.open(directorio, fstream::in |  fstream::app);//fstream::out |
  3.                archivo.clear();
  4. archivo.seekp(inicio);
  5. archivo.write(datos.c_str(), datos.length());//sobreescribe.
  6. 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.


Título: Re: Problema abrir archivo
Publicado por: ivancea96 en 17 Agosto 2015, 17:47 pm
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.


Título: Re: Problema abrir archivo
Publicado por: Kaxperday en 18 Agosto 2015, 17:21 pm
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
  1. datos = datos + contenido.substr(inicio);
  2. archivo.clear();
  3. archivo.seekp(inicio);
  4. archivo.write(datos.c_str(), datos.length());
  5. archivo.close();