sexta-feira, 12 de dezembro de 2014

End Of File (EOF)

End Of File (EOF)

   Hoje irei falar sobre o End Of File (EOF) conhecido como Final de Arquivo. O EOF pode ser utilizado em um programa quando você for fazer um programa que leia um arquivo de texto com um número indeterminado de linha.
   Para fazermos o teste usaremos o terminal do Linux e a IDE de trabalho CodeBlocks.

   O processamento utilizado sera um processamento qualquer, que no caso faz a inversão de cada linha, lembrado é um processamento qual quer ele não se restringe só neste que irei mostrar.
faça o seguinte código:

void limparBuffer(void){
   char c;
   while ((c=getchar())!='\n'&& c!=EOF);
}

int main(){
   char str[tam];
   int c,i;
   while(scanf("%[^\n]",str)!=EOF){
      c=strlen(str);
      for(i=c;i>=0;i--){
         printf("%c",str[i]);
      }
       printf("\n");
      limparBuffer();
}

   Como já foi dito em um Post anterior, nós usaremos a função de Limpeza de Buffer para limpar o buffer e não atrapalhar na leitura do nosso arquivo, o EOF aparece tanto na função quanto no código. Na função ele aparece para limpa caractere por caractere ate que seja encontrado o Enter ou ate que seja encontrado o EOF que é o nosso caso. Já no código ele é usado para ler varias linhas de um arquivo ate que acabe, quando acabar ele retorna o EOF que consecutivamente para o programa ali.

   Agora faremos um arquivo de texto de preferencia .txt com o nome de in.txt (de input) que recebera o algumas linhas. Este arquivo tem que ficar dentro da pasta raiz do programa para ser executado com maior facilidade.

Andre
Athos
Fernando
Leticia

   Agora iremos executar o programa, para executar no terminal faça o seguinte. Aperte Ctrl+F9 no CodeBlocks para somente compilar o programa, olhe no build log para saber se houve algum erro, caso não tenha vá para a pasta onde o código fonte do programa esta pelo terminal e faça o seguinte código: “./nome_do_programa < in.txt”, caso não tenha usado a função de limpeza de buffer ele entrara em loop pois ira ler somente a primeira linha infinitamente e não encontra o EOF para poder para, dando algo parecido com isso:

erdnA
erdnA
erdnA
erdnA
erdnA
erdnA
...

Caso tenha dado certo o resultado deve ser parecido com esse:

erdnA
sohtA
odnanreF
aiciteL


 Bom pessoal espero que tenha gostado e ate mais.

quinta-feira, 4 de dezembro de 2014

Limpando a “sujeirinha” do teclado “Limpeza de Buffer”

Ei, você! Sabe pra quê serve uma Limpeza de Buffer?
Não?? Então se liga nessa dica ...
Suponhamos que existam 3 funções, uma após a outra e ao tentar ler o caractere na segunda função, o programa simplesmente colocar o enter (\n) e já “pula” para a terceira(no nosso caso não haverá a leitura terceira). A limpeza de buffer serve para evitar este tipo de problema.
Um exemplo de quando é necessário limpar:

int main()
{
    char a;
    int b;
    printf("Informe caractere: ");
    a = getchar();
    printf("Informe numero: ");
    b = getchar();
    printf("%d",a);
    printf("%d",b);
    return 0;
}

Mas como limpar o buffer?
Cria-se uma função na qual chamaremos "limparBuffer", para isso criaremos vamos definir uma variável do tipo char e logo após faremos um ciclo while. Exemplo:

void limparBuffer(){
   char c;
   while ((c = getchar()) != “\n” && c != EOF);
}
O que esses comandos fazem é ir "pegando" os elementos do buffer, até que o caractere '\n' apareça, ou o EOF(end of file)Em outras palavras, enquanto c for diferente de quebra de linha ou c for diferente de EOF o ciclo vai continuar a execução.
Agora é só chamar a função apos cada leitura. Exemplo:

void limparBuffer()
{
   char c;
   while ((c = getchar()) != “\n” && c != EOF);
}
int main()
{
    char a;
    int b;
    printf("Informe caractere: ");
    a = getchar();
    limparBuffer();
    printf("Informe numero: ");
    b = getchar();
    limparBuffer();
    printf("%d",a);
    printf("%d",b);
    return 0;
}

Agora um método simples, utilizando o próprio scanf() é o seguinte:

scanf(" %d", &b); //repare no espaço entre o " e o %.

ou ainda:

scanf("\n%d", &b); //agora o "\n"

Simples não é? Isso já é o suficiente pra limpar o buffer.

Aproveitem!!!