View Full Version : EOF - End of File
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)
End of file = Fim do ficheiro .... acho que é Ctrl+D se a minha memoria não me engana
Se eu fizer ctrl+d nao acontece nada. :(
Tas em linux ... certo ?
Não :S Porque?
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
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
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 ;)
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?
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 :)
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:
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 :)
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?
Ctrl + D
Se tiveres em linux.
O que faz o getchar? Sem saber isso é dificil responder...
o getchar atribui o valor que eu introduzir á variavel "c"
c = getchar();
Estou em windows.
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.
É 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?
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...).
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
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 :)
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.
EOF (end of file) em windows é ctrl+z que é o char(26) se não me engano.
Ya exactamente, descobri agora mesmo :)
Thanks anyway :)
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. :)
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).
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 <stdio.h>
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...
Por acaso, tanto no windows como no linux o valor do EOF é -1.
experimenta:
#include <stdio.h>
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.
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.
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.
mas olhem la, o char 0, na era o '\0' ?
mas olhem la, o char 0, na era o '\0' ?
Epá, claro que sim. o \0 é o EOF.
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
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...
|
|