paulo1205
(usa Ubuntu)
Enviado em 21/02/2023 - 18:32h
Boot32 escreveu:
boa noite galera do vol!
então, o codigo é esse:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
char var;
FILE *arq;
arq = fopen("dados.txt", "r");
while((var = fgetc(arq) != EOF)){
O erro está na forma como você construiu a expressão, particularmente com a posição em que você fechou os parênteses. Note que você atribuiu a
var o valor da comparação entre o caráter lido do arquivo e a constante
EOF. Provavelmente, o que você quis dizer foi
while((var = fgetc(arq)) != EOF)
(note o fechamento dos parênteses da expressão de atribuição antes da comparação, e não depois de
EOF, como você havia feito).
Fora isso, seu programa tem outro problema: o tipo da dados retornado por
fgetc() é
int, não
char. Se você usar
char num PC típico
†, fica impossível distinguir entre o caráter cujo valor numérico é
255 (que, no Windows em Português e outros sistemas que usam representação de caracteres com oito bits, tipicamente corresponde a um Y minúsculo com trema (“
ÿ”)) e o valor de
EOF (que é
-1).
printf("%c", var);
}
return 0;
}
o problema é que aparece caracteres estranhos quando executo
† Em máquinas com arquitetura Intel/AMD, o tipo
char possui a mesma representação interna que
signed char, o que significa que os valores numéricos possíveis vão de
-128 até
127, em vez de
0 a
255, que seria o caso de
unsigned char. Se você atribuir um valor
N entre
128 e
255 a uma variável do tipo
char, o valor resultante será interpretado como negativo (especificamente, tal valor será numericamente equivalente a
N-256). Quando um valor com essa representação é usado numa expressão (por exemplo, numa comparação com
EOF), ele é convertido para
int (ou
long ou
long long, a depender dos outros componentes da expressão) preservando a representação com sinal. O seguinte programa ilustra bem isso, ao imprimir o valor
-1 como resultado ao ser executado, e não
255.
#include <stdio.h>
int main(void){
const char x=255;
printf("%d\n", x);
}
Note ainda que alterar o tipo da variável
var no seu programa de
char para
unsigned char (ou se você usar a opção do compilador que muda o comportamento padrão de considerar
char como número com sinal para número sem sinal, ou ainda se utilizar uma arquitetura que tenha a representação sem sinal como padrão), o
bug no seu código não seria resolvido, mas apenas seria convertido em outro tipo de
bug: se com um
char com sinal, você não consegue distinguir
EOF de um caráter válido com valor numérico
255 (e pode ter alguma dificuldade com outros caracteres com valor negativo), com um
char sem sinal, você simplesmente nunca vai conseguir armazenar o valor de
EOF adequadamente, pois ao receber tal valor (que é
-1) da função
fgetc(), tal valor será convertido para
255 ao ser guardado na variável e ao ser usado posteriormente em expressões. O programa abaixo ilustra isso, ao produzir como saída o valor
255.
#include <stdio.h>
int main(void){
const unsigned char x=-1;
printf("%d\n", x);
}
A moral da história é: sempre que você usar funções de leitura orientadas a caráter (
fgetc(),
getc(),
getchar()), lembre-se de que o valor tem de ser atribuído a uma variável do tipo
int.
... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)