View Full Version : EOF - End of File


Luka
31-10-2004, 17:41
Andava eu todo contente a seguir este tutorial http://freebooks.by.ru/view/CProgrammingLanguage/kandr.html quando me falam em EOF - End of file

Sou muito noob nisto e o meu inglês nao é nada de espectacular. Nao percebo o que é um EOF.

Fiz o programa que la manda que é este.

#include < stdio.h >
main()
{
int c;

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

Ja percebi que o que o programa faz é devolver o valor introduzido até ser digitado um EOF. Mas o que raio é um end of file? :confused:

Ja agora, outra perguntinha. Como é que uma variavel inteira consegue guardar uma palavra? É por ter o getchar? Porque nao utilizar a variavel como char já que esta engloba numeros e caracteres?

EDIT: porque é que nao dá para escrever < stdio.h > sem os espaços entre os parenteses e a palavra? (Aqui no forum)

Madril
31-10-2004, 17:51
End of file = Fim do ficheiro .... acho que é Ctrl+D se a minha memoria não me engana

Luka
31-10-2004, 17:55
Se eu fizer ctrl+d nao acontece nada. :(

Madril
31-10-2004, 17:56
Tas em linux ... certo ?

Luka
31-10-2004, 18:01
Tas em linux ... certo ?

Não :S Porque?

Tafinho
31-10-2004, 18:18
End of file = Fim do ficheiro .... acho que é Ctrl+D se a minha memoria não me engana

E que tem o valor de ZERO (0)

destr0yer
31-10-2004, 18:19
End of file = Fim do ficheiro .... acho que é Ctrl+D se a minha memoria não me engana
O EOF serve tipo para leituras e escritas de ficheiros, é para alertar ao programa quando chega ao fim do ficheiro, faz qq coisa, em geral acabar o ciclo de escrita/leitura

também existe o EOL (End Of Line)
No teu caso:
while (c != EOF)
{
//...
}

O que isso faz?
Enquanto c não for o fim do ficheiro (o operador ! significa negação), o ciclo continua a executar as instrunções entre as { }

;)
p.s.- Realmente, se por < stdio.h > junto, simplesmente, desaparece 8o

Luka
31-10-2004, 18:22
Hum.. Nao estou a perceber muito bem o que voces estao a dizer :(

O que eu percebo do programa é que vai ler o valor que eu introduzir e escreve-lo até eu introduzir um EOF.

Ou seja, se eu introduzir um A ele vai escrever o A
Se eu introduzir um B ele vai escrever um B

e assim sucessivamente até ser introduzido um EOF que eu entendo como sendo um caracter ou um conjunto de caracteres que ele identifica com sendo EOF e faz o programa parar de repetir o que eu introduzo.

Am I right? :confused:

EDIT: Eu avisei que era noob :p

kanguru
31-10-2004, 18:23
realmente não percebo pq usam um inteiro pa guardar char's, mas é possivel, visto que um inteiro usa 32bit's e um char 8bit... cabe la dentro na b0a :)

quanto ao EOF é p que o pessoal ja referiu :)

destr0yer
31-10-2004, 18:25
realmente não percebo pq usam um inteiro pa guardar char's, mas é possivel, visto que um inteiro usa 32bit's e um char 8bit... cabe la dentro na b0a :)

quanto ao EOF é p que o pessoal ja referiu :)

pois, para guardar um char utiliza-se:

char c;

o tipo INT é para numeros inteiros ;)

Luka
31-10-2004, 18:25
O EOF serve tipo para leituras e escritas de ficheiros, é para alertar ao programa quando chega ao fim do ficheiro, faz qq coisa, em geral acabar o ciclo de escrita/leitura

também existe o EOL (End Of Line)
No teu caso:
while (c != EOF)
{
//...
}

O que isso faz?
Enquanto c não for o fim do ficheiro (o operador ! significa negação), o ciclo continua a executar as instrunções entre as { }

;)
p.s.- Realmente, se por < stdio.h > junto, simplesmente, desaparece 8o

Entao suponhamos que eu tenho este programa
#include<stdio.h>
main()
{
int c;
c = getchar();
while(c != EOF)
{
putchar(c);
c = getchar();
}
printf("LOL");
}

Ele vai repetir o que eu introduzir até eu introduzir um EOF. No momento em que eu introduzir um EOF ele vai digirar a palavra LOL e acabar o programa. É isto?

Luka
31-10-2004, 18:27
realmente não percebo pq usam um inteiro pa guardar char's, mas é possivel, visto que um inteiro usa 32bit's e um char 8bit... cabe la dentro na b0a :)

quanto ao EOF é p que o pessoal ja referiu :)

Eu também nao percebi essa do inteiro :\ Mas pronto, fiz como estava no tutorial. Por acaso experimentei com Char e como é logico também funcionava. Aliás, isto tb era uma duvida que tinha :)

AwakE
31-10-2004, 18:32
Ele vai repetir o que eu introduzir até eu introduzir um EOF. No momento em que eu introduzir um EOF ele vai digirar a palavra LOL e acabar o programa. É isto?
Tu não te precisas de preocupar em colocar um EOF. Se criares um ficheiro .txt por exemplo, escreveres para lá "Hello!" e depois gravares, o caracter EOF é colocado automaticamente no fim.

Basicamente o programa vai lendo caracter a caracter, quando encontrar o EOF (ou fim de ficheiro) pára de ler, como tem lógica né? Se o ficheiro acabou não há mais nada para ler certo?

Se tiveres a ler caracteres do ecran, se meteres um EOF, o Crtl + D do Madril, ele sai do ciclo.

PS: Já nao me lembro o que faz o putchar e o getchar por isso...
PS2: Não deve ser preciso dizer isto, mas não uses o ZERO para terminar a leitura. O código ASCII do zero é 48, e não 0 ;)

destr0yer
31-10-2004, 18:36
Tu não te precisas de preocupar em colocar um EOF. Se criares um ficheiro .txt por exemplo, escreveres para lá "Hello!" e depois gravares, o caracter EOF é colocado automaticamente no fim.

Basicamente o programa vai lendo caracter a caracter, quando encontrar o EOF (ou fim de ficheiro) pára de ler, como tem lógica né? Se o ficheiro acabou não há mais nada para ler certo?

Se tiveres a ler caracteres do ecran, se meteres um EOF, o Crtl + D do Madril, ele sai do ciclo.

PS: Já nao me lembro o que faz o putchar e o getchar por isso...
ya...

O que eu costumo usar para leituras do ecran é por um ciclo FOR infinito e uma condição de paragem, um CTRL + D ou Z por exemplo e o ciclo acaba...
se nao existisse esta condição de paragem, se desse CTRL + D, entrava em ciclo infinito :lol:

kanguru
31-10-2004, 18:37
A do inteiro é chamado casting. Penso eu de que. Podes por int a = 'A'; ele converte o char para inteiro, atraves do seu codigo ascii. Se meteres printf("%d",c); no teu programa, vai aparecer o codigo ascii em vez da letra. Pronto é so pa dizer que podes mudar o tipo de variavel como queres. Desde que saibas o que tas a fazer claro.

Que consideras interir um EOF? é que não é escrever EOF, é uma espécie de macro, que ao atingir o fim de um ficheiro, ou atravez de ctrl + d, se for pelo stdin, retorna 1. Por isso eh ke o usas para ler ficheiros :)

edit: ta mta gente neste topic a eskrever ao msm tempo lol :)

Luka
31-10-2004, 18:47
O melhor é perguntar assim:

O que tenho de fazer para sair do ciclo while e ser apresentado a paravra "LOL" neste programa?

#include
main()
{
int c;
c = getchar();
while(c != EOF)
{
putchar(c);
c = getchar();
}
printf("LOL");
}

É que o programa nao para de repetir o ciclo :S Se eu quiser sair do ciclo faço o que?

kanguru
31-10-2004, 18:51
Ctrl + D

Se tiveres em linux.

AwakE
31-10-2004, 18:51
O que faz o getchar? Sem saber isso é dificil responder...

Luka
31-10-2004, 18:52
o getchar atribui o valor que eu introduzir á variavel "c"

c = getchar();

Estou em windows.

AwakE
31-10-2004, 18:57
o getchar atribui o valor que eu introduzir á variavel "c"

c = getchar();

Estou em windows.
É um questão de descobrires quais as teclas para inserir um EOF.

Luka
31-10-2004, 18:59
É um questão de descobrires quais as teclas para inserir um EOF.

Essa é a questão essencial do primeiro post. :)

Ao perguntar o que era um EOF queria dizer, que valor ou teclas correspondem a um EOF.

Se calhar fiz-me entender mal.
Ja percebi que em linux um EOF é ctrl+D
E em windows?

AwakE
31-10-2004, 19:05
Se calhar fiz-me entender mal.

Pois, foste pouco consiso.

Em relação ao comando para Windows...olha, procura. Ainda tentei ver aqui nuns livros mas não encontro referencia ao comando (para Linux ja encontrei varias vezes...).

kanguru
31-10-2004, 19:05
pois em windows na te sei ajudar. Podes sempre alterar isso para ele ler um ficheiro :) ele aí encontra o EOF de certeza :)

ou usar o equivalente no windows de ./exe < ola.txt

windows nem no google encontrei :|

EDIT: experimenta Ctrl + Z ou +F enkontrei algures...

EDIT2 : ja vim tarde :P

Luka
31-10-2004, 19:08
pois em windows na te sei ajudar. Podes sempre alterar isso para ele ler um ficheiro :) ele aí encontra o EOF de certeza :)

Podes explicar melhor isso de ele ler um ficheiro?

Epa, sou um bocado chato, é verdade :D Mas comecei a programar a dois dias no pc (em 2 anos de escola nunca passamos do papel...)
Anteontem deu-me na cabeça para instalar o C e ver umas coisinhas.

Depois de uma pesquisa exaustiva no google encontrei uma combinação de ctrl+Z que me encrava o programa e passado um pouco da erro e desliga.
Tenho de procurar melhor :( Estava com esperança que alguem aqui soubesse.

EDIT: My mistake!!! É mesmo o ctrl+Z :)

NoMercy
31-10-2004, 19:10
Essa é a questão essencial do primeiro post. :)

Ao perguntar o que era um EOF queria dizer, que valor ou teclas correspondem a um EOF.

Se calhar fiz-me entender mal.
Ja percebi que em linux um EOF é ctrl+D
E em windows?
EOF (end of file) em windows é ctrl+z que é o char(26) se não me engano.

Luka
31-10-2004, 19:11
EOF (end of file) em windows é ctrl+z que é o char(26) se não me engano.

Ya exactamente, descobri agora mesmo :)
Thanks anyway :)

kanguru
31-10-2004, 19:23
http://www.mhuffman.com/notes/dos/bash_cmd.htm -> pa kem kizer :) tem alguns comandos de linux comparados com windows.

boa sorte aí na tua aprendizagem. Devias era experimentar um linuxzito. :) Se bem que as diferenças de C de windows pa linux, não sao muitas. Pelo menos ainda nao notei grande coisa. :)

Tafinho
01-11-2004, 03:07
EOF (end of file) em windows é ctrl+z que é o char(26) se não me engano.

Pode ser crt+z , mas o seu valor é sempre 0 em qualquer sistema operativo...
Char(26) é o número 4 ...salvo o erro, mas o EOF é sempre o 0, sendo o caracter zero = char(22).

NoMercy
02-11-2004, 16:13
Pode ser crt+z , mas o seu valor é sempre 0 em qualquer sistema operativo...
Char(26) é o número 4 ...salvo o erro, mas o EOF é sempre o 0, sendo o caracter zero = char(22).
Por acaso, tanto no windows como no linux o valor do EOF é -1.
experimenta:


#include &lt;stdio.h&gt;
int main()
{
int c=0;
printf("%d\n",EOF);
c = getc(stdin);
return 0;
}

tambem podes abrir o "stdio.h" e ver o valor que lá está, que é nada menos nada mais que -1.

Segundo a Microsoft sobre, Windows ou MS-DOS, o caracter EOF é char(26).
http://support.microsoft.com/default.aspx?scid=kb;en-us;71464
Não encontrei muita informação sobre isto...

Tafinho
02-11-2004, 19:31
Por acaso, tanto no windows como no linux o valor do EOF é -1.
experimenta:


#include &lt;stdio.h&gt;
int main()
{
int c=0;
printf("%d\n",EOF);
c = getc(stdin);
return 0;
}

tambem podes abrir o "stdio.h" e ver o valor que lá está, que é nada menos nada mais que -1.


Não contes a ningnuém, mas -1 não é um char... e o EOF é sempre usado como Char, pois tirando alguns casos pontuais, todas as leituras são char a char.
Quando usas o EOF com um char, é feito um cast de -1 para char, que dá 0.
De nada te vale ires ver ao stdio.h se depois não sabes usar...

No exemplo que mostras é um caso típico, em vez de

int c=0;
printf("%d\n",EOF);
c = getc(stdin);
return 0;


O getc devolve um char e não um int. Se tiveres a usar um compilador decente, devias ter um erro a indicar que estás a fazer um cast implícito.
Devias ter


char c = EOF;
printf("%d\n",c);
c = getc(stdin);
return 0;



E vês como o resultado é radicalmente diferente.

NoMercy
02-11-2004, 20:30
Não contes a ningnuém, mas -1 não é um char...
Eu sei, é por isso é que o valor do EOF é -1 ...


e o EOF é sempre usado como Char, pois tirando alguns casos pontuais, todas as leituras são char a char.
Quando usas o EOF com um char, é feito um cast de -1 para char, que dá 0.
De nada te vale ires ver ao stdio.h se depois não sabes usar...

No exemplo que mostras é um caso típico, em vez de

int c=0;
printf("%d\n",EOF);
c = getc(stdin);
return 0;


O getc devolve um char e não um int. Se tiveres a usar um compilador decente, devias ter um erro a indicar que estás a fazer um cast implícito.


...ou um aviso (warning), eu sei.
Em linux usei o gcc.
Tens razão sobre a linha "c = getc(stdin);" em que c é um inteiro. Só pus essa linha para quando estou a correr em windows o IDE/compilador possa correr o programa e parar a consola para ver o resultado. E sim, há mais e melhores maneiras de fazer isto. Foi feito um pouco á pressa, sorry.


Devias ter


char c = EOF;
printf("%d\n",c);
c = getc(stdin);
return 0;



E vês como o resultado é radicalmente diferente.

Eu fiz "printf("%d\n",EOF);" de propósito.

Tafinho
02-11-2004, 20:47
Tens razão sobre a linha "c = getc(stdin);" em que c é um inteiro. Só pus essa linha para quando estou a correr em windows o IDE/compilador possa correr o programa e parar a consola para ver o resultado. E sim, há mais e melhores maneiras de fazer isto. Foi feito um pouco á pressa, sorry.


O problema não era isso.
Da forma que estavas a fazer tinhas o c como um inteiro, e fazias o print do EOF, quando devias ter usado o c para guardar o EOF, como se faz nos getchar.

kanguru
02-11-2004, 23:20
mas olhem la, o char 0, na era o '\0' ?

Tafinho
02-11-2004, 23:31
mas olhem la, o char 0, na era o '\0' ?


Epá, claro que sim. o \0 é o EOF.

kanguru
02-11-2004, 23:58
Epá, claro que sim. o \0 é o EOF.

hmmm na foi isso que aprendi. '\0' é o que aparece no fim de cada string. Um texto tem varias strings, portanto varios '\0'. mas EOF so existe um... mas então não percebo :| ehe

Tafinho
03-11-2004, 00:06
hmmm na foi isso que aprendi. '\0' é o que aparece no fim de cada string. Um texto tem varias strings, portanto varios '\0'. mas EOF so existe um... mas então não percebo :| ehe

É a mesma coisa.
Por isso é que sempre se assume que o EOF é 0, para poder ser coerente.
Por isso é que podes copiar para uma string a partir de um getchar, sem te preocupares muito...