WHILE em ANSI-C - retorna valor vazio

7 respostas
M

Olá,

Sou novo no fórum do GUJ (é também meu primeiro fórum a frequentar), estou aprendendo a linguagem C na faculdade, porém, deparei-me com um problema.
Estou desenvolvendo um algoritimo que lê um determinado ponteiro que abre um arquivo TXT, quando executo o WHILE lendo este ponteiro e atribuo o valor do conteúdo a uma variável, ao sair do WHILE este valor é descarregado, ou seja, enquanto estou dentro do WHILE e executo o printf da variável, consigo ver o valor, mas quando saio do WHILE esta variável fica vazia.
Abaixo o código que estou usando:

/* Efetua a leitura do File Pointer do caminho do arquivo para criptografia */
     while (var_ls_arq_entrada != EOF) 
     { 
        printf("%c", var_ls_arq_entrada);
        var_ls_arq_entrada = getc(fp_le_conf_cam_entrada);
     }
     printf("%c", var_ls_arq_entrada);

Não consigo identificar a maneira correta, para ao sair do WHILE, a variável continuar com o valor carregado para que eu utilize no restante do algoritimo.

Agradeço se alguém puder ajudar-me,

Muito obrigado,

[]s

Gustavo Matelucati

7 Respostas

E

http://www.cplusplus.com/reference/clibrary/cstdio/getc/

Quando o arquivo acabou, o valor retornado por getc é EOF mesmo, ou seja, o arquivo acabou e não faz sentido você tentar pegar mais nenhuma informação dele. Mas não entendi por que é que seu processamento não deva ser feito dentro do WHILE (quando o arquivo ainda não acabou).

M

Olá entanglement,

Primeiramente obrigado pela ajuda, na verdade entendi seu ponto de vista, mas a minha idéia é que o processamento finalizasse dentro do while e depois, com a variável carregada com o resultado do processamento, eu pudesse utilizá-la em outro ponto do meu código.
Na verdade terei vários whiles abrindo alguns arquivos TXT e posteriormente, armazenando os resultados em variáveis, para em outra parte do código, fazer um if e tomar algumas decisões.

Obrigado,

[]s

Gustavo Matelucati

douglaskd

olha isso:

var_ls_arq_entrada = getc(fp_le_conf_cam_entrada);

você esta pegando somente 1 caractere do texto e sobrescrevendo a variável... no final você esta imprimindo ou o ultimo caractere ou um caractere de espaço " "

você deve usar um "vetor de char" que em C isso é uma String

como ficaria:

char var_ls_arq_entrada[30]; // se o texto for maior aumenta o tamanho, ou faça a contagem de caracteres do arquivo antes de criar esta variável
int cont=0;

while (fp_le_conf_cam_entrada != EOF)   
{   
    var_ls_arq_entrada[cont] = getc(fp_le_conf_cam_entrada);  
    printf("%c", var_ls_arq_entrada[cont]);  
 }  
var_ls_arq_entrada[cont+1]='\0';
printf("%s", var_ls_arq_entrada);

tenta isso ae...não testei

M

Olá douglaskd, boa tarde!

Obrigado pela dica, porém, tentei utilizar o código conforme demonstrado, mesmo assim a variável retornou vazia.
Entendi sua explicação, estou consultando o livro que tenho para entender melhor esta parte com vetores.
Para não ter problemas com o tamanho do que será colocado dentro da variável, criei a variável conforme código abaixo:

typedef char* string;
string var_ls_arq_entrada;

E no local onde faz o while, incluí o código que você mencionou, mas não funcionou.
Muito obrigado pela dica e pelo tempo disponibilizado, se testar algo que funcione e puder me avisar, agradeço.

[]s

Gustavo Matelucati

douglaskd

me desculpe agora ta testado rs, tinha esquecido o incremento do contador....

segue código completo

#include <stdio.h>

main(){

FILE *fp_le_conf_cam_entrada = fopen("arq.txt","r");


char var_ls_arq_entrada[30]; // se o texto for maior aumenta o tamanho, ou faça a contagem de caracteres do arquivo antes de criar esta variável
int cont=0;
char letra;

while ((letra = getc(fp_le_conf_cam_entrada)) !=EOF)
 {
    var_ls_arq_entrada[cont] = letra;
    printf("%c", var_ls_arq_entrada[cont]);
    cont++;
 }
 var_ls_arq_entrada[cont]='\0';
 printf("%s", var_ls_arq_entrada);

}
M

Olá douglaskd,

Muito obrigado por mais esta ajuda, vou testar o código agora no período da noite na faculdade.
Lhe envio as considerações, mas entendi o que você tentou explicar.
Realmente sem este contador, a posição que eu estava pegando era vazia.
Muito bom mesmo, assim que adaptar o código (e o mais importante, entender seu funcionamento) postarei aqui no fórum.

[]s

Gustavo Matelucati

M

Boa noite douglaskd,

O código funcionou perfeitamente, fiz a adaptação em meu projeto e está ótimo.
Entendi o erro que estava cometendo ao depurar o exemplo que me enviou, realmente estava pegando uma posição vazia.
Excelente idéia.

Grato,

[]s

Gustavo Matelucati

Criado 20 de novembro de 2010
Ultima resposta 22 de nov. de 2010
Respostas 7
Participantes 3