paulo1205
(usa Ubuntu)
Enviado em 05/04/2016 - 17:47h
jacksonterceiro escreveu:
Aqui está uma parte do código
printf("Entrou no case 1\n");
token = strtok(NULL, ";");
printf("Letra: %s\n", token);
telefonica = fopen("contatos.txt", "r");//Abre o arquivo .txt //LER "r"
if (telefonica == NULL)
{
printf("Não existe arquivo!");
}
Veja que legal: você imprime uma mensagem dizendo que o arquivo não existe mas, mesmo assim, continua a linha seguinte a executar como se ele existisse!
while(1)
{
char c;
char e;
c = getc(telefonica);
if ((c == EOF) || (e == EOF))
{
break;
}
Epa! Você está testando o valor de
e antes de o definir. Assim, o se programa pode abortar o loop, se calhar de, por acaso, o valor inicial de
e for convertido em
EOF .
Outro erro nesse mesmo trecho:
c e
e deveriam ter sido declarados como
int , não como
char , pois a função
getc () retorna
int , e o valor
EOF é uma constante inteira fora da faixa de 0 a 255 (ou -128 a 127). Se você usar
char para essas variáveis, suas comparações com
EOF vão sempre ser problemáticas, caindo em um dos dois seguintes casos:
1) Se
char for sem sinal (i.e. tiver valores entre 0 e 255), na hora de comparar com a constante inteira
EOF (que normalmente vale -1), a comparação será sempre falsa, mesmo que você tenha chegado ao final do arquivo e
getc () tenha tentado lhe sinalizar isso.
2) Se
char for com sinal (como é na maioria dos nossos PCs, o que implica ter valores que vão de -128 a 127), fica impossível distinguir
EOF do caráter com valor 255 (que nos sistemas de codificação ISO-8859-1, ISO-8859-15 e Windows-1252, usados para líguas do Oeste da Europa, corresponde ao símbolo “
ÿ ”, ou “Y minúsculo com trema”). Isso acontece porque a atribuição do valor 255 a um
char com sinal o converte aquele 255 para -1, o qual, na hora de ser comparado com um inteiro com sinal (que é o caso de
EOF ), é convertido para a representação inteira de -1, e não de volta para 255.
printf("Letras_Contatos Cadastrados: %c\n", c);
do
{
e = getc(telefonica);
if (e == EOF)
{
break;
}
//printf("Caractere lido: %c\n", e);
}while( e != '\n' );
if (c == 'J')
{
printf("Achou a comparação!!\n");
}
Preciso que quando ele ache um contato com a letra J ele imprima no terminal toda a linha contendo o nome e o telefone. E em seguida continue procurando para ver se achar mais algum contato com a letra J.
E por que você, em vez de ler caráter a caráter, não lê de linha em linha?