Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: m@o_614 en 28 Agosto 2013, 21:16 pm



Título: Archivos
Publicado por: m@o_614 en 28 Agosto 2013, 21:16 pm
Saludos

Tengo que hacer un  programa que copie todos los caracteres de un archivo fuente a uno destino, ya he creado el archivo fuente (el que contiene los caracteres), y ya lo pude abrir, el problema es que no se muy bien como manejar archivos y como hacer que me recorra toda la linea de caracteres y copiarlos en otro archivo.

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main()
  5. {
  6.    FILE *p;
  7.    p = fopen("F:\\archivo.txt","r");
  8.    if(p!=NULL)
  9.       printf("Si se pudo abrir el archivo\n");
  10.    else
  11.    {
  12.        printf("No se pudo abrir el archivo\n");
  13.        exit(1);
  14.    }
  15.    return 0;
  16. }

no les pido que me muestren el codigo, solo que me den una idea de como hacerlo

gracias


Título: Re: Archivos
Publicado por: eferion en 28 Agosto 2013, 21:28 pm
Tutoriales en internet al respecto tienes a patadas.

Pon en google "tutorial manejo ficheros c" y tendrás resultados de sobra.

Explicártelo a ti en exclusiva es como reinventarse la rueda... Ya esta echo en otro sitio... Es mas cómodo que visites el sitio  :P


Título: Re: Archivos
Publicado por: m@o_614 en 29 Agosto 2013, 02:33 am
ya revise algunos tutoriales y me resolvio muchas dudas, el codigo por ahora lo tengo asi:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main()
  5. {
  6.    FILE *fd;
  7.    int ad;
  8.    ad = creat("F:\\archivo_destino.txt",755);
  9.    if((fd = fopen("F:\\archivo_fuente.txt","r"))!=NULL)
  10.    {
  11.        while(read(fd,ad,1)!=NULL)
  12.            write(1,ad,1);
  13.    }
  14.    else
  15.    {
  16.        printf("No se pudo abrir el archivo\n");
  17.        exit(1);
  18.    }
  19.    close(fd);
  20.    return 0;
  21. }

primero ya que tengo mi archivo con una cadena de caracteres, tengo que pasarlas a otro archivo, y es ahi donde no se que hacer, si crear el archivo destino(a donde voy a copiar los caracteres), de esta manera:

Código
  1.  
  2. int ad;
  3. ad = creat("F:\\archivo_destino.txt",755);
  4.  

y pasarle ad a la funcion read

Código
  1. while(read(fd,ad,1)!=NULL)

o crear un array tipo char para ahi almacenar la cadena del archivo fuente

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main()
  5. {
  6.    FILE *fd;
  7.    char cad[40];
  8.    if((fd = fopen("F:\\archivo_fuente.txt","r"))!=NULL)
  9.    {
  10.        while(read(fd,cad,1)!=NULL)
  11.            write(1,cad,1);
  12.    }
  13.    else
  14.    {
  15.        printf("No se pudo abrir el archivo\n");
  16.        exit(1);
  17.    }
  18.    close(fd);
  19.    return 0;
  20. }


Título: Re: Archivos
Publicado por: rir3760 en 29 Agosto 2013, 04:00 am
Si no tienes un libro de calidad sobre C deberías conseguir uno, por ejemplo "The C Programming Language", en el se trata el tema de copia de archivos (utilizando la entrada y salida estándar) en el primer capitulo.

Un problema con tu programa es verificar si la función read (http://linux.die.net/man/2/read) (parte del estándar POSIX) retorna NULL para indicar error (en esa situación la función retorna -1).

Es mas fácil realizar esa operacion utilizando la biblioteca estándar de C, con ella solo tienes que abrir los archivos con fopen y a continuación utilizar un bucle donde lees un carácter de la entrada y lo envías a la salida. Mas o menos así:
Código
  1. FILE *entrada;
  2. FILE *salida;
  3. int ch;
  4.  
  5. /* Apertura de archivos */
  6.  
  7. /* Procesamos todos los caracteres */
  8. while ((ch = fgetc(entrada)) != EOF)
  9.   fputc(ch, salida);
  10.  
  11. /* Cierre de archivos */
  12.  
  13. /* etc */

Un saludo


Título: Re: Archivos
Publicado por: m@o_614 en 29 Agosto 2013, 21:35 pm
saludos rir3760 todavia no he conseguido el libro pero si encontre algunos tutoriales, si es mas rapida la manera en la que tu lo hiciste pero primero tengo que empezar a trabajar con las funciones basicas, read(), open(), write, etc..

Ahora en este codigo con el fopen(), creo y a la vez abro un archivo.txt para ahi escribir la cadena hola mundo, pero por alguna razon solamente me crea el archivo pero no me escribe la cadena en el archivo.txt

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4.  
  5. int main()
  6. {
  7.    FILE *fd;
  8.    if((fd = fopen("F:\\archivo_fuente.txt","w"))!=NULL)
  9.        write(fd,"hola mundo",10);
  10.    else
  11.    {
  12.        printf("No se pudo crear el archivo\n");
  13.        exit(1);
  14.    }
  15.    return 0;
  16. }
  17.  

gracias


Título: Re: Archivos
Publicado por: Stereo en 29 Agosto 2013, 21:50 pm
Haz un while !feof, usa fgets para obtener los carácteres de cada línea, usa fprintf para escribir en un archivo y termina con fclose para evitar bugs.


Título: Re: Archivos
Publicado por: m@o_614 en 30 Agosto 2013, 00:10 am
saludos ahora ya por fin ya me escribe hola mundo en el archivo.txt, pero el fopen lo tuve que cambiar por un simple open, y el problema es que con el fopen yo podia crear el archivo y abrirlo al mismo tiempo, y con el open no puedo, el archivo tiene que existir de antemano para poder abrirlo

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4.  
  5. int main()
  6. {
  7.    int fd;
  8.    if((fd = open("F:\\archivo_fuente.txt",1))>0)
  9.        write(fd,"hola mundo",10);
  10.    else
  11.    {
  12.        printf("No se pudo crear el archivo\n");
  13.        exit(1);
  14.    }
  15.    return 0;
  16. }

eso es lo que no entiendo, por que con fopen() no me escribe en el archivo y con open si???

gracias


Título: Re: Archivos
Publicado por: rir3760 en 30 Agosto 2013, 04:22 am
lo que no entiendo, por que con fopen() no me escribe en el archivo y con open si?
Porque estas mezclando funciones del estándar POSIX (open y write) con funciones del estándar ISO (fopen).

En el caso de write (http://linux.die.net/man/2/write) su primer argumento es el descriptor de archivo y es de tipo int, no puedes pasar el valor de retorno de fopen (http://web.archive.org/web/20110814162917/http://dinkumware.com/manuals/default.aspx?manual=compleat&page=stdio.html#fopen) porque este es de tipo "FILE *".

Un saludo


Título: Re: Archivos
Publicado por: m@o_614 en 30 Agosto 2013, 15:29 pm
Muchas gracias, una ultima pregunta

No hay alguna manera de que se pueda utilizar el fopen y pasar su puntero tipo *FILE a la funcion write();???? aunque sean de estandares diferentes


EI: juntando mensajes.

ya!! ya consegui que me compilara correctamente, lo unico que hice fue cambiar el write() por el fwrite() y ponerle los parametros adecuados

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4.  
  5. int main()
  6. {
  7.    FILE *fd;
  8.    char cad[]={"Hola mundo"},*ptr;
  9.    ptr = cad;
  10.    if((fd = fopen("F:\\archivo_fuente.txt","w"))!=NULL)
  11.        fwrite(ptr,1,10,fd);
  12.    else
  13.    {
  14.        printf("No se pudo abrir el archivo\n");
  15.        exit(1);
  16.    }
  17.    return 0;
  18. }
  19.