/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Leer un fichero de texto entero

 
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
NathanD



Registrado: 03 Oct 2012
Mensajes: 18

MensajePublicado: 21/02/2013 11:24 am
Título: Leer un fichero de texto entero

Buenas, estoy con ficheros, y tengo una duda. No consigo copiar un fichero de principio a fin si tiene saltos de línea. Lo he intentado de más de una forma, ésta una de ellas:

Código:
while (! feof(fichero))
 {
fgets(linea, 80, fichero);
}


Pongo un printf al final del bucle para imprimir la cadena, pero sólo imprime la última línea. En cambio si lo pongo dentro del bucle, me imprime cada línea.

¿Qué podría hacer y dónde estoy confundido? Gracias de antemano y saludos.
Volver arriba
leosan



Registrado: 19 Abr 2012
Mensajes: 730
Ubicación: GRAN CANARIA

MensajePublicado: 21/02/2013 12:00 pm
Título: Re: Leer un fichero de texto entero

NathanD escribió:
Buenas, estoy con ficheros, y tengo una duda. No consigo copiar un fichero de principio a fin si tiene saltos de línea. Lo he intentado de más de una forma, ésta una de ellas:

Código:
while (! feof(fichero))
 {
fgets(linea, 80, fichero);
}

....................................................

Entiendo por el título del tema y el código que pones que no puedes "leer" el fichero y es que te faltaría "escribir" lo que lee fgets:
Código:
while ( !feof(fichero) )
        {
            fgets(linea, 80, fichero);
            puts(linea);
        }


O mejor:
Código:
while (fgets(linea, 80, fichero) != NULL) {
         puts(linea);
    }


Si lo que pretendes es "copiar" el fichero en otro no entiendo entonces a qué te refieres.
Saluditos!.
Volver arriba
NathanD



Registrado: 03 Oct 2012
Mensajes: 18

MensajePublicado: 21/02/2013 12:25 pm
Título:

Buenas,

quizá no me expliqué bien, mi propósito es "coger" todo el contenido de un fichero, para posteriormente copiarlo en otros archivos de texto y cosas por el estilo.
Volver arriba
leosan



Registrado: 19 Abr 2012
Mensajes: 730
Ubicación: GRAN CANARIA

MensajePublicado: 21/02/2013 1:47 pm
Título:

NathanD escribió:
Buenas,
quizá no me expliqué bien, mi propósito es "coger" todo el contenido de un fichero, para posteriormente copiarlo en otros archivos de texto y cosas por el estilo.


Entonces el camino es otro, haciendo uso en especial de fread para ir leyendo bloques y fwrite para ir escribiendo. Una versión muy sencilla de un copiador, que te puede servir para iniciarte, es el siguiente:

Código:
/* Copiador de ficheros */

#include <stdio.h>
FILE *fichOrg, *fichDest; /* Los dos ficheros */
char buffer[2048];
 /* un buffer de 2048 bytes (2 K),para ir leyendo la
 información por bloques (y guardando después cada bloque
en el otro fichero */
char nombreOrg[80], /* Los nombres de los ficheros */
nombreDest[80];
int cantidad; /* El número de bytes leídos */
int main(void)
{
/* Accedo al fichero de origen */
    printf("Introduzca el nombre del fichero Origen: ");
    scanf("%s",nombreOrg);
    if ((fichOrg = fopen(nombreOrg, "rb")) == NULL)
        {
            printf("No existe el fichero origen!\n");
            exit(1);
        }
/* Y ahora al de destino */
    printf("Introduzca el nombre del fichero Destino: ");
    scanf("%s",nombreDest);
    /*lo siguiente puede resultar menos legible que hacerlo en
    dos líneas separadas, como hemos hecho hasta ahora,
    pero es más compacto, y, sobre todo, muy frecuente
    encontrarlo en  “fuentes ajenos” más avanzados*/
    if ((fichDest = fopen(nombreDest, "wb")) == NULL)
        {
            printf("No se ha podido crear el fichero destino!\n");
            exit(1);
        }
/* Mientras quede algo que leer */
    while (! feof(fichOrg) )
    {
        /* Leo datos: cada uno de 1 byte, todos los que me caben */
        cantidad = fread( buffer, 1, sizeof(buffer), fichOrg);
        /* Escribo tantos como haya leído */
        fwrite(buffer, 1, cantidad, fichDest);
    }
    /* Cierro los ficheros */
    fclose(fichOrg);
    fclose(fichDest);
    return 0;
}


Pero repito, es una opción muy básica. Existen formas más sofisticadas de calcular el tamaño del fichero original(uso de fseek y ftell, reserva dinámica de memoria) y comprobar que lo escrito se corresponde con dicho tamaño.
Pero en fin, no vamos a dártelo todo hecho. Wink
Saluditos!.
Volver arriba
NathanD



Registrado: 03 Oct 2012
Mensajes: 18

MensajePublicado: 24/02/2013 8:55 am
Título:

Muchas gracias, me ha sido de gran ayuda
Volver arriba
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com