Archivos

Iniciado por m@o_614, 28 Agosto 2013, 21:16 PM

0 Miembros y 1 Visitante están viendo este tema.

m@o_614

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

eferion

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

m@o_614

#2
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;
}

rir3760

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 (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
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

m@o_614

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

Stereo

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.

m@o_614

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

rir3760

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 su primer argumento es el descriptor de archivo y es de tipo int, no puedes pasar el valor de retorno de fopen porque este es de tipo "FILE *".

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

m@o_614

#8
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;
}