Test Foro de elhacker.net SMF 2.1

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.

#include <stdio.h>
#include <stdlib.h>

int main()
{
    FILE *p;
    p = fopen("F:\\archivo.txt","r");
    if(p!=NULL)
       printf("Si se pudo abrir el archivo\n");
    else
    {
        printf("No se pudo abrir el archivo\n");
        exit(1);
    }
    return 0;
}


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:

#include <stdio.h>
#include <stdlib.h>

int main()
{
   FILE *fd;
   int ad;
   ad = creat("F:\\archivo_destino.txt",755);
   if((fd = fopen("F:\\archivo_fuente.txt","r"))!=NULL)
   {
       while(read(fd,ad,1)!=NULL)
           write(1,ad,1);
   }
   else
   {
       printf("No se pudo abrir el archivo\n");
       exit(1);
   }
   close(fd);
   return 0;
}


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:

   
int ad;
ad = creat("F:\\archivo_destino.txt",755);


y pasarle ad a la funcion read

while(read(fd,ad,1)!=NULL)

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

#include <stdio.h>
#include <stdlib.h>

int main()
{
   FILE *fd;
   char cad[40];
   if((fd = fopen("F:\\archivo_fuente.txt","r"))!=NULL)
   {
       while(read(fd,cad,1)!=NULL)
           write(1,cad,1);
   }
   else
   {
       printf("No se pudo abrir el archivo\n");
       exit(1);
   }
   close(fd);
   return 0;
}
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í:
FILE *entrada;
FILE *salida;
int ch;

/* Apertura de archivos */

/* Procesamos todos los caracteres */
while ((ch = fgetc(entrada)) != EOF)
   fputc(ch, salida);

/* Cierre de archivos */

/* 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

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main()
{
    FILE *fd;
    if((fd = fopen("F:\\archivo_fuente.txt","w"))!=NULL)
        write(fd,"hola mundo",10);
    else
    {
        printf("No se pudo crear el archivo\n");
        exit(1);
    }
    return 0;
}


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

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main()
{
    int fd;
    if((fd = open("F:\\archivo_fuente.txt",1))>0)
        write(fd,"hola mundo",10);
    else
    {
        printf("No se pudo crear el archivo\n");
        exit(1);
    }
    return 0;
}


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
Cita de: m@o_614 en 30 Agosto 2013, 00:10 AMlo 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

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main()
{
    FILE *fd;
    char cad[]={"Hola mundo"},*ptr;
    ptr = cad;
    if((fd = fopen("F:\\archivo_fuente.txt","w"))!=NULL)
        fwrite(ptr,1,10,fd);
    else
    {
        printf("No se pudo abrir el archivo\n");
        exit(1);
    }
    return 0;
}