Programación General > C/C++

 Copiar archivos con C

(1/2) > >>

spyfly:
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?

su -:
Aunque no he probado el codigo, ahi va:

--- Código: C ---#include <fcntl.h>#include <stdio.h>#include <unistd.h> int fp = open("fichero", O_RDONLY);if ( fp < 0 ) {    perror("Error: can't open data filesn");    exit(EXIT_FAILURE);}// leemos desde el inicio del ficherolseek(fp, 0, SEEK_SET);int err = 0;char buffer;while ( ( err = read(fp, buffer, sizeof(char)) ) > 0 ) {    printf("Siguiente caracter: %cn", buffer);}close(fp);  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)

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

ProfesorX:
¿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++ --- #include <cstdio>#include <cstdlib>#include <cstring>#include <cctype> char letra;FILE *ficheroL, *ficheroE; int main (){       // modo "rb" binario lectura, si no especificas b lo abre en modo texto    // (modo por defecto) como si escribieras "rt"    ficheroL = fopen("archivo1.dat", "rb");    // modo "wb" binario escritura, igual que antes, si no especificas    // binario, lo abre en modo texto, como si escribieras "wt"    ficheroE = fopen("archivo2.dat", "wb");    letra=getc(ficheroL);    while (feof(ficheroL)==0)    {        putc(letra,ficheroE);        printf("%c", letra);        letra=getc(ficheroL);    }     fclose(ficheroL);    fclose(ficheroE);     system("pause");    return 0;}  
Saludos :)

su -:
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 ---int fp = open("fichero", O_RDONLY | O_BINARY); 

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

Ir a la versión completa