1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Problema a ler ficheiro em C

Discussão em 'Programação' iniciada por pmcosta, 4 de Novembro de 2007. (Respostas: 7; Visualizações: 1514)

  1. Estou a tentar implementar uma função que me leia dígitos de um ficheiro e os guarde numa estrutura:

    //Declaração da estrutura
    struct item {
    int value;
    struct item *next;
    };
    typedef struct item element;

    estou a usar:

    void read_list(element **list_head, char* file_name){
    FILE *fp;
    element *curr;
    char c;

    /* abre novamente para a leitura */
    fp = fopen(file_name,"rb");
    while (!feof(fp))
    {
    fscanf(fp,"%c",&c);
    curr = (element *)malloc(sizeof(element));
    curr->value = c;
    printf("valor designado (curr->value) %c\n",curr->value);
    curr->next = *list_head;
    *list_head = curr;
    }
    fclose(fp);
    }


    O problema é que a estruturas acaba por me guardar, não dos inteiros mas mas sim a sua correspopndencia em decimal (ie 0 fica 48,1 fica 49, etc).

    Desde já agradeço qualquer ajuda.
     
  2. Tens de usar a função atoi para obter o valor numérico da string que lês. :)
     
  3. AliFromCairo

    AliFromCairo Power Member

    Boas, substitui o char c por int i, e o fscanf(fp, "%c", &c) por fscanf(fp, "%d", &i). Não te esqueças também de colocar na format string do printf "%d" ao invés de "%c" se precisares de imprimir um inteiro.
     
  4. Boas, antes demais obrigado pela ajuda aos

    AliFromCairo
    ao substituir charc por int i, acabo por receber um inteiro com todos os dígitos que estão no ficheiro...

    Mr.BrigthSide, segui o teu conselho e substitui "curr->value = c;" por "curr->value = atoi(c);" mas recebo a seguinte mensagem do gcc "warning: passing argument 1 of ‘atoi’ makes pointer from integer without a cast", que não entendo.

    Podem-me ajudar mais uma vez?
     
    Última edição: 4 de Novembro de 2007
  5. AliFromCairo

    AliFromCairo Power Member

    A função atoi recebe como argumento uma string (char*) e não um char. Aconselhava-te a experimentar a solução que propus acima, que penso ser a maneira mais simples para ler inteiros, no caso de eles estarem separados.
     
  6. AliFromCairo, mais uma obrigado pela ajuda separei os dígitos (com \n) e funciona com um pequeno senão, guarda-me o ultimo digito duas vezes...
     
  7. AliFromCairo

    AliFromCairo Power Member

    Hmm, experimenta colocar "%d\n" no fscanf. Outra coisa, no caso de precisares mesmo de ter os dígitos juntos e precisares de ler um de cada vez, podes utilizar o método que tinhas inicialmente que lia chars. Para converter para int podes fazer:

    Código:
    char c = '1';
    int i = c - '0'; /* na prática, estás a fazer 49 - 48, 
                           que vai dar o inteiro que pretendes guardar */
    
     
  8. Resolvido com "%d\n" no fscan. Mais uma vez muito obrigado!
     

Partilhar esta Página