SoloCodigo

Programación General => C/C++ => C++ Builder => Mensaje iniciado por: Ithilien en Lunes 13 de Agosto de 2007, 19:32

Título: Problema Copiando Ficheros
Publicado por: Ithilien en Lunes 13 de Agosto de 2007, 19:32
Hola, no sé que pasa con un programa que tengo hecho en C++ Builder. Quiero copiar 6 ficheros. Uno de ellos es .jpg y los otros son .php. Pues bien, los meto todos en una cola, y los voy sacando ( los paths para hacer el proceso iterativo. Me ocurre que solo me copia el primero y no sé por qué es. He probado a poner 6 flujos de entrada diferentes, uno para cada fichero de entrada, y otros 6 distintos para los de salida. El código es:

Código: Text
  1.  
  2. char * buffer = new char[4096];
  3. int leidos;
  4. ifstream fi;
  5. ofstream fo;
  6.  
  7. fi.open("fichero.php");
  8. fo.open("copia.php");
  9.  
  10. if ( fi ){
  11.    do{
  12.        fi.read( buffer, 4096 );
  13.        leidos = fi.gcount();
  14.        fo.write( buffer, leidos );
  15.    }while( leidos > 0 );    
  16. }
  17.  
  18. delete []buffer;
  19.  
  20.  

Que esta pasando? Gracias!
Título: Re: Problema Copiando Ficheros
Publicado por: Eternal Idol en Martes 14 de Agosto de 2007, 00:12
¿Ese es el codigo? ¿Seguro? Eso solo abre UN archivo ...

Por cierto, es mejor usar CopyFile ya que trabajas en Windows.
Título: Re: Problema Copiando Ficheros
Publicado por: Ithilien en Viernes 17 de Agosto de 2007, 07:50
Hola Eternal,

usé al final CopyFile, mucho más homogéneo para todos los archivos y me va de lujo. No sé por qué fallaban los ifstream / ofstreams...supongo que me está pidiendo el PC un formateo a gritos!

Gracias :lol:
Título: Re: Problema Copiando Ficheros
Publicado por: Eternal Idol en Viernes 17 de Agosto de 2007, 08:07
Cita de: "Ithilien"
Hola Eternal,

usé al final CopyFile, mucho más homogéneo para todos los archivos y me va de lujo. No sé por qué fallaban los ifstream / ofstreams...supongo que me está pidiendo el PC un formateo a gritos!

Gracias :lol:
Lo dudo, seguramente el codigo estaba mal.
Título: Re: Problema Copiando Ficheros
Publicado por: Ithilien en Viernes 17 de Agosto de 2007, 08:11
Pues raro es, porque era exactamente el mismo código para todos los archivos. Metí los paths en dos pilas ( una para los ficheros de entrada y otra para los ficheros de salida ) y apliqué un while ( !pila.empty() ){ ... } y luego el código que viste asi que no sé que pasaba. Yo diría que el código no estaba mal. Y lo que hacía el programa es solo copiarme el contenido del ultimo fichero cuyo path metía en último lugar en la pila, esto es, el primero que sacaba de ésta. Para los demás, solo creaba los archivos, pero vacíos.
Título: Re: Problema Copiando Ficheros
Publicado por: Eternal Idol en Viernes 17 de Agosto de 2007, 09:03
Cita de: "Ithilien"
Pues raro es, porque era exactamente el mismo código para todos los archivos. Metí los paths en dos pilas ( una para los ficheros de entrada y otra para los ficheros de salida ) y apliqué un while ( !pila.empty() ){ ... } y luego el código que viste asi que no sé que pasaba. Yo diría que el código no estaba mal. Y lo que hacía el programa es solo copiarme el contenido del ultimo fichero cuyo path metía en último lugar en la pila, esto es, el primero que sacaba de ésta. Para los demás, solo creaba los archivos, pero vacíos.
Si el codigo hubiera estado bien hubiera funcionado ...
Título: Re: Problema Copiando Ficheros
Publicado por: Ithilien en Viernes 17 de Agosto de 2007, 09:10
Pues te invito a que analices el código siguiente:

Código: Text
  1.  
  2. stack<char *> originales;
  3. stack<char *> copias;
  4. ifstream fi;
  5. ofstream fo;
  6. char *buffer;
  7. int leidos;
  8.  
  9. originales.push("web\\archivo1.php");
  10. copias.push("C:\\www\\archivo1.php");
  11.  
  12. originales.push("web\\archivo2.php");
  13. copias.push("C:\\www\\archivo2.php");
  14.  
  15. originales.push("web\\archivo3.php");
  16. copias.push("C:\\www\\archivo3.php");
  17.  
  18. originales.push("web\\archivo4.php");
  19. copias.push("C:\\www\\archivo4.php");
  20.  
  21. buffer = new char[4096];
  22.  
  23. while ( !originales.empty() ){
  24.    fi.open(originales.top());
  25.    fo.open(copias.top());
  26.  
  27.    do{
  28.          fi.read( buffer, 4096 );
  29.          leidos = fi.gcount();
  30.          fo.write( buffer, leidos );
  31.    }while( leidos > 0 );
  32.  
  33.    origianeles.pop();
  34.    copias.pop();
  35.    fi.close();
  36.    fo.close();
  37. }
  38.  
  39. delete []buffer;
  40.  
  41.  

Si encuentras el error, te agradecería que me indicaras donde está.

Gracias!
Título: Re: Problema Copiando Ficheros
Publicado por: Eternal Idol en Viernes 17 de Agosto de 2007, 10:10
Lo encontre despues de depurar un rato la STL, siendo sincero no es mi fuerte ya que no se usa en modo Kernel en lo absoluto. Es probable que haya maneras mas correctas de hacerlo pero el punto es que despues de la primera lectura se marca un flag de estado con un valor de error y, esto es algo que no me cabe en la cabeza que pase, se arrastra en el stream pese a hacer close y open posteriormente ...

Poniendo un fi.clear(); antes de cerrar o despues de abrir se soluciona el problema.
Título: Re: Problema Copiando Ficheros
Publicado por: Ithilien en Viernes 17 de Agosto de 2007, 10:14
Madre mía! Me parece increible...bueno, como nota positiva, todos los días se aprende algo, ¡y vaya qué algo!

Te doy las gracias por molestarte en mirar el código, pero pudiste ver como, el código parece correcto y un error te dejaa  :unsure: ...

De nuevo gracias!
Título: Re: Problema Copiando Ficheros
Publicado por: Eternal Idol en Viernes 17 de Agosto de 2007, 10:16
Cita de: "Ithilien"
Madre mía! Me parece increible...bueno, como nota positiva, todos los días se aprende algo, ¡y vaya qué algo!

Te doy las gracias por molestarte en mirar el código, pero pudiste ver como, el código parece correcto y un error te dejaa  :unsure: ...

De nuevo gracias!
Es que no es del todo correcto ... en mi caso los archivos no tienen 4096 bytes por ejemplo ... en tu caso probablemente el flag se arrastre despues de unos cuantos read (del primer archivo) pero uno de los mismos al llegar al final del archivo y no tener este 4096 bytes pondra el estado a erroneo.