Linguagem C: Ler caracteres especiais a partir de um arquivo. [RESOLVIDO]

1. Linguagem C: Ler caracteres especiais a partir de um arquivo. [RESOLVIDO]

Renan Novaes
zerotres

(usa Outra)

Enviado em 13/05/2013 - 16:39h

Desenvolvi a seguinte função.
Inicialmente ela percorre um arquivo em busca de um caractere gráfico.
Ao encontrar, ele grava cada caractere gráfico subsequente na variável string até encontrar um caractere não gráfico. (obtem palavras no arquivo)
Retorna EOF se encontrar o fim do arquivo ou o número de caracteres percorridos no arquivo se uma palavra for obtida.



int getWord(FILE *file, char *string) {
/* A função considera palavra qualquer junção de caractere GRÁFICO */

int contador = 0; /* Conta o número de caracteres lidos no arquivo */

/* Percorre o arquivo a procura da primeira palavra */
while(!isgraph(*string = fgetc(file))) {
++contador;
if(feof(file)) return EOF;
}

/* Grava a palavra na string passada por referência */
while(isgraph(*string)) {
++contador;
*(++string) = fgetc(file);
}

*string = NULL;
return contador;
}

O problema é que quando simulei, ele não considera caracteres especiais - como é, ú, ç, ã - como caracteres gráficos.
Oque devo fazer? ouvi falar de wchat_t e setlocale, mas não sei como usar.



  


2. Re: Linguagem C: Ler caracteres especiais a partir de um arquivo. [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 21/05/2013 - 14:31h

O uso é mesmo complicado e complexo.

Qual conjunto de caracteres e qual codificação você está usando? Se estiver com um conjunto de caracteres de oito bits, possivelmente pode usar a codificação trivial de que cada símbolo ocupa exatamente um byte, e não precisará de wchar_t e <wctype>, possivelmente bastando ajustar a locale com setlocale().

Por padrão, um programa em C começa com a locale "C", que tem como conjunto de caracteres válidos apenas o ASCII (caracteres de 0 a 127). Não é de estranhar que, nesse caso, tentar passar algo fora dessa faixa dê algum problema.

Mas existe outro cuidado que você tem de ter: o argumento de isgraph() e suas irmãs não é char (normalmente, nos nossos PCs com Intel e AMD, cujos valores, convertidos para inteiro, vão de -128 a 127), mas int, e o manual diz explicitamente que a função só define o comportamento da função se o argumento de entrada for representável como unsigned char (em inteiros, de 0 a 255) e EOF (que tem valor inteiro -1). Se você não tomar cuidado de converter o seu caráter com oito bits para unsigned char, pode ser que ele seja convertido para um inteiro negativo, em lugar de um valor entre 128 e 255. Preste bastante atenção nisso.


3. Acho que temos um início

Renan Novaes
zerotres

(usa Outra)

Enviado em 21/05/2013 - 15:23h

Baixei o código fonte de alguns programas que trabalham com essa obtenção de caracteres especiais em arquivos. Todos são complicadíssimos e parecem predefinir um conjunto de caracteres a serem lidos. O programa que estou fazendo tem uma proposta interessante, mas precisa acima de tudo, entender caracteres de qualquer idioma para uso inicialmente em terminal.
Parece mesmo que vou gastar um tempo estudando sobre setlocale e coisas do gênero.

Obrigado pela resposta.


4. Re: Linguagem C: Ler caracteres especiais a partir de um arquivo. [RESOLVIDO]

Renan Novaes
zerotres

(usa Outra)

Enviado em 22/05/2013 - 00:44h

Bom consegui resolver o problema usando wchar_t e setlocale. Existem funções específicas para wchar_t. Recomendo para quem sofre do mesmo problema, que explorem essa página: http://pubs.opengroup.org/onlinepubs/7908799/xsh/wchar.h.html






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts