Ayuda con "Copia de archivos" que aparece en el manual de Kernighan and Ritchie

Iniciado por Pink Floydiano, 29 Enero 2011, 20:05 PM

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

Pink Floydiano

Buenas.

Recientemente, me he bajado el manual para aprender lenguaje C de Kernighan and Ritchie. Me está pareciendo bastante educativo y estoy intentado asimilar todo lo posible  :)

Sin embargo, he llegado a un punto en el que me he atascado un poco y me preguntaba si alguno podría ayudarme. He de decir que soy completamente nuevo en esto, así que pido disculpas si la pregunta les parece tonta (nunca antes me había puesto a aprender un lenguaje de programación).

El problema en cuestión está en el capítulo 1.5.1, llamado "Copia de archivos". En él, puede verse el siguiente programa:

#include <stdio.h>

main()
{
        int c;

        c= getchar();
        while (c!= EOF) {
                putchar(c);
                c= getchar();
        }
}


Entonces, tengo dos preguntas:

1) A pesar de que en el manual explican cada uno de los componentes, creo que no acabo de entender para qué sirve  :-[ Lo he ejecutado y simplemente copia las palabras que meto en la consola... ¿Alguien me explica la utilidad de este programilla?

2) Al final del capítulo me proponen como ejercicio "Verifique que la expresión getchar ()!= EOF es 0 o 1" y "Escriba un programa que imprima el valor de EOF". Aquí, al igual que antes, no entiendo lo que me piden...

Muchas gracias a todos de antemano por la ayuda.
Ubuntu user.
Android user.
Linuxero :)

Ferno

Lo que estás haciendo con dicha función es ir tomando caracter a caracter de un archivo (en este caso, stdin, el archivo de entrada por defecto; es decir, la consola), y pegándolos (en este caso también en el archivo de salida por defecto, la consola).

Para que te quede un poco más claro, si utilizas este algoritmo y getchar() en un archivo de texto plano (.txt por ejemplo), de cualquier lugar de tu computadora, copiará el contenido del archivo de texto y lo pegará en la pantalla (puede ser otro archivo de texto, o también la consola). Pero para aprender esto necesitarás saber manejo de archivos (no recuerdo si hay algo relacionado en el libro de K&R).

Con respecto a tu punto 2). EOF hace referencia a End Of File. Cuando estás leyendo un archivo, y éste termina (por ejemplo, termina de leer todo un texto en el .txt) hay una marca llamada EOF, que le avisa al programa que ese archivo ha llegado a su fin. Este se lee con por ejemplo, getchar() y posee un valor. Cuando llega a ese valor, en el algoritmo que tu escribiste, sale del ciclo, y deja de leer, puesto que sabe que llegó a su fin.

Pink Floydiano

#2
Ah! Ya entiendo la función del programa, muchísimas gracias  ;-)

Por cierto, según he leído en el manual, hay una forma más sencilla de expresar el programa que he puesto antes, es ésta:

#include <stdio.h>

main()
{
int c;

while((c= getchar()) != EOF)
putchar(c);
}


Pero lo que sigo sin comprender es la parte en la que me piden que "imprima el valor de EOF". Entiendo lo que propone el ejercicio, pero no tengo ni la más mínima idea de cómo comenzar a hacer este programa... ¿Algún consejo?
Ubuntu user.
Android user.
Linuxero :)

Ferno

Si, revisa tu algoritmo. El ciclo itera siempre y cuando c sea distinto de EOF.
Por ende, este saldrá del ciclo cuando c sea igual a EOF.
Ahora bien, ya sabes que luego de salir del ciclo, tendrás EOF en la variable c. Lo único que queda por hacer es imprimirla en la pantalla.
Escribe una sentencia que imprima en la pantalla la variable c. Y listo ^^
Saludos!

Pink Floydiano

Para resolver el problema que me preguntan, he probado con lo siguiente:

#include <stdio.h>

main()
{
        int c;

        c= EOF;
printf("%d\n", c);

}


Como se supone que ahora c=EOF, al imprimir c estoy imprimiendo el EOF. Cuando ejecuto este programa en la consola, me aparece un "-1".

¿Está bien o he hecho una tontería  :xD ?

PD: Vuelvo a repetir mi escasa experiencia como posible disculpa ante la locura que haya podido hacer  :-[
Ubuntu user.
Android user.
Linuxero :)

Ferno

De http://es.wikipedia.org/wiki/EOF :

"La interpretación de C como resultado de la operación de lectura en caso de ser EOF es, por lo general, -1."

Así que no estás tan loco :P

Pink Floydiano

Muchísimas gracias Ferno, con gente como tú da gusto aprender  ;)
Ubuntu user.
Android user.
Linuxero :)

negux

Aqui esta otra version para imprimir el valor de EOF



#include<stdio.h>
int main()
{
   printf("EOF = %d\n",EOF);

   return 0;
}

flacc

de donde lo bajaste?, es ta en español?... podrías pasarme el link por favor?...gracias

Ferno

Cita de: mini_nauta en  4 Febrero 2011, 07:03 AM
de donde lo bajaste?, es ta en español?... podrías pasarme el link por favor?...gracias

En el topic de Libros/papers de esta misma sección (el primero) se encuentra la versión en español y la versión en ingles.