• Domingo 17 de Noviembre de 2024, 13:17

Autor Tema:  Copiar archivos con C  (Leído 17672 veces)

spyfly

  • Miembro activo
  • **
  • Mensajes: 81
    • Ver Perfil
Copiar archivos con C
« en: Viernes 6 de Mayo de 2011, 16:04 »
0
Hola

Queria copiar el contenido de 3 archivo en otro archivo de salida. Añadiendo un par de nuevas lineas entre esos archivos. Empezamos por copiar el completo del primer archivo, programando en c, lo he intentando con estas lineas:

letra=getc(ficheroL);
         while (feof(ficheroL)==0)
         {
            putc(letra,ficheroE);
            printf( "%c",letra );
            letra=getc(ficheroL);
         }


pero no me reproduce exactamente el mismo contenido ya que el primer archivo tiene un caracter raro como un cuadrado y en la copia lo detecta como un salto de linea, como puedo solucionar esto?
La vida es dura
             SPYFLY


su -

  • Moderador
  • ******
  • Mensajes: 2349
    • Ver Perfil
Re: Copiar archivos con C
« Respuesta #1 en: Domingo 8 de Mayo de 2011, 17:54 »
0
Aunque no he probado el codigo, ahi va:
Código: C
  1. #include <fcntl.h>
  2. #include <stdio.h>
  3. #include <unistd.h>
  4.  
  5. int fp = open("fichero", O_RDONLY);
  6. if ( fp < 0 ) {
  7.     perror("Error: can't open data filesn");
  8.     exit(EXIT_FAILURE);
  9. }
  10. // leemos desde el inicio del fichero
  11. lseek(fp, 0, SEEK_SET);
  12. int err = 0;
  13. char buffer;
  14. while ( ( err = read(fp, buffer, sizeof(char)) ) > 0 ) {
  15.     printf("Siguiente caracter: %cn", buffer);
  16. }
  17. close(fp);
  18.  
  19.  
Con eso lo haces  ;) pero ten en cuenta que muchas de las funciones (como las de unistd.h) se encuentra en otro lado en Windows (como io.h)
*******PELIGRO LEE ESTO!!*******

There is no place like 127.0.0.1

Conecto luego existo, no conecto luego insisto.

spyfly

  • Miembro activo
  • **
  • Mensajes: 81
    • Ver Perfil
Re: Copiar archivos con C
« Respuesta #2 en: Lunes 9 de Mayo de 2011, 12:00 »
0
con read y write me ocurre lo mismo, el cuadradito a copiar no se interpreta de esa manera sino como un salto de linea.

Con fread y fwrite me ocurre lo mismo... los cuadrados los interpreta como salto de línea.


Con fscanf y fprintf tampoco me interpreta de manera correcta ese cuadradito.
La vida es dura
             SPYFLY


ProfesorX

  • Moderador
  • ******
  • Mensajes: 796
  • Nacionalidad: mx
    • Ver Perfil
Re: Copiar archivos con C
« Respuesta #3 en: Lunes 9 de Mayo de 2011, 19:30 »
0
¿Estas abriendo el archivo en modo binario o en modo texto? Sospecho que lo abres en modo texto. Si no especificas el modo, por defecto te abre el archivo en modo texto, como si pusieras "t", para abrirlo en modo binario debes definir explictamente modo binario "b", aunque no pones el codigo para abrir el archivo, pero sospecho que ese es tu problema. En modo texto, te convierte los caracteres de salto de linea (0xA) en 2, salto de linea y retorno de carro (0xA OxD), dependiendo de tu sistema operativo.

Te dejo un codigo de ejemplo, lo probe y me funciona adecuadamente en windows, compilado con Visual Studio 2010. Si eso no resuelve tu problema, publica una porcion mas grande de tu codigo, que incluya como abres y cierras tu archivo.

Código: C++
  1.  
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <cstring>
  5. #include <cctype>
  6.  
  7. char letra;
  8. FILE *ficheroL, *ficheroE;
  9.  
  10. int main ()
  11. {  
  12.     // modo "rb" binario lectura, si no especificas b lo abre en modo texto
  13.     // (modo por defecto) como si escribieras "rt"
  14.     ficheroL = fopen("archivo1.dat", "rb");
  15.     // modo "wb" binario escritura, igual que antes, si no especificas
  16.     // binario, lo abre en modo texto, como si escribieras "wt"
  17.     ficheroE = fopen("archivo2.dat", "wb");
  18.     letra=getc(ficheroL);
  19.     while (feof(ficheroL)==0)
  20.     {
  21.         putc(letra,ficheroE);
  22.         printf("%c", letra);
  23.         letra=getc(ficheroL);
  24.     }
  25.  
  26.     fclose(ficheroL);
  27.     fclose(ficheroE);
  28.  
  29.     system("pause");
  30.     return 0;
  31. }
  32.  
  33.  

Saludos :)

NOTA:
==================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
==================================================================

su -

  • Moderador
  • ******
  • Mensajes: 2349
    • Ver Perfil
Re: Copiar archivos con C
« Respuesta #4 en: Jueves 12 de Mayo de 2011, 06:02 »
0
La función getc() no devuelve un entero en vez un char ?  :huh:

En sistemas POSIX (Linux, *BSD...) tanto read como write trabajan a nivel binario (al igual que open) y no existe forma de decirle que no lo haga (para el es una secuencia de bytes). Supongo que estas en Windos... asi que le debes agregar el flag O_BINARY para asegurarse de no modificar los datos, o usar la opcion de ProfesorX  :) .
Código: C
  1. int fp = open("fichero", O_RDONLY | O_BINARY);
  2.  
*******PELIGRO LEE ESTO!!*******

There is no place like 127.0.0.1

Conecto luego existo, no conecto luego insisto.

Leber

  • Miembro activo
  • **
  • Mensajes: 65
    • Ver Perfil
Re: Copiar archivos con C
« Respuesta #5 en: Jueves 12 de Mayo de 2011, 09:27 »
0
Cita de: "su -"
La función getc() no devuelve un entero en vez un char ?  :huh:

Si, devuelve un entero, que es el codigo en ascii que representa dicha letra o numero.  ^_^