Problema a ler ficheiro em C

pmcosta

Membro
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.
 
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.
 
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:
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.
 
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...
 
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 */
 
Back
Topo