segunda-feira, 10 de dezembro de 2012

EOF


Alguns problemas do spoj especificam o final da entrada da seguinte maneira:
A entrada é terminada por fim de arquivo (EOF). EOF é End Of File (Fim de Arquivo).

Como detectar o fim de arquivo em um programa C?

Na linguagem C, a maneira utilizada para indicar condições excepcionais durante a execução do programa é funções que retornam um "funny values" ou um status code. 

Mais sobre exceções em C :
http://marathoncode.blogspot.com.br/2012/11/excecoes-em-c.html

Sobre outros "problemas" da linguagem C:
http://marathoncode.blogspot.com.br/2012/07/porque-c-nao-e-minha-linguagem-de.html

Todo bug lo suficientemente avanzado es indistinguible de una feature.
– Rich Kulawiec


Em caso de sucesso, a função scanf retorna o número de itens da lista de argumentos  lidos com sucesso. Esta contagem pode igualar o número esperado de itens ou ser menos (mesmo zero) devido a uma falha de correspondência, um erro de leitura,  ou o alcance do fim de arquivo.

Se um erro de leitura acontece ou o fim-de-arquivo é atingido durante a leitura,  um indicador adequado é sinalizado. E, se acontece alguma coisa antes de um dado pode ser lido com sucesso, EOF é retornado.

Geralmente, EOF é uma definição de macro do tipo int que se expande em uma constante inteira negativa (geralmente, -1).

http://www.cplusplus.com/reference/cstdio/scanf/

Tratamento do fim de arquivo em C
while( scanf("%d",&t) != EOF ){
}
ou
while( scanf("%d",t) > 0  ){
}
Tratamento do fim de arquivo em C++
while( cin >> t){
}
ou
cin >> t;
while( !cin.eof()  ){
}
http://www.cplusplus.com/reference/ios/ios/eof/

Existem vários exemplos na diferença do tratamento de erros entre C e C++.

Tratamento de falha de alocação em C
#include <stdlib.h>
#include <stdio.h>

int main(){

 int size = 1000000000;
 int *p;
 
 p = (int*)malloc(size*sizeof(int));
 
 if(p==NULL){
  printf("Memoria insuficiente");
  system("PAUSE");
  exit(1);
 }

 system("PAUSE");
 return 0;

}
Tratamento de falha de alocação em C++
#include <iostream>
#include <new>

using namespace std;

int main(){

 int size = 1000000000;
 int *p;
 
 try{
  p = new int[size];
 }catch( bad_alloc& ba){
  cerr << "bad_alloc caught: " << ba.what() << endl;
 }
 system("PAUSE");
 return 0;
}
#include <iostream>
#include < new >

using namespace std;

int main(){

 int size = 1000000000;
 int *p;
 
 
 p = new (nothrow) int[size];
 
 if(p==0){
  cerr << "bad_alloc caught" << endl;
  system("PAUSE");
  
 }
 return 0;
}
http://www.cplusplus.com/reference/new/bad_alloc/

Checagem de índice fora da faixa
#include 
#include 
#include 
using namespace std;

int main(){
 
 int v1[10];
 v1[11] = 5;//C não tem tratamento para índice fora da faixa
 
 //C++ verifica os indices fora da faixa do vector com a função at 
 vector  v2(10); 
 try{
  v2.at(11) = 6;
 }catch (out_of_range& oor) {
    cerr << "Out of Range error: " << oor.what() << endl;
 } 
 
 system("PAUSE");
 

}

http://www.cplusplus.com/reference/vector/vector/at/
http://www.cplusplus.com/reference/stdexcept/out_of_range/

Nenhum comentário: