Jump to content
heavenheart

Ler uma lista apartir de um txt

Recommended Posts

heavenheart

Ola pessoal gostava ke me dessem umas sugestoes para ler de um fixeiro txt e por os dados numa lista duplamente ligada aki esta o meu codigo mas ele por alguma razao nao funciona

/

/ LER NORMAL COMPRAS
void lerCompras(lista *pLista) 
{FILE * fp;
        char    strVazia = 's';
        lista   *p;
        p = pLista->prox;
fp = fopen("DadosCompras.txt","r");
while(p != NULL)
{fscanf(fp,"%d\n%d\n%d\n%s\n%f\n%d\n%d\n%d\n",
   &p->idcompra,&p->codigocliente,&p->codigoartigo,p->artigo,&p->preco,&p->quantidade,&p->data,&p->paga);
    p = p->prox;
}
fclose(fp);

}

Se alguem me pudesse dar uma vista de olhos a ver se descobre o erro pk ele compila e funciona mas nao poe nda na lista

Desde ja Obrigado

Share this post


Link to post
Share on other sites
Diutsu

tens de alocar espaço para um novo elemento, inserir os dados nesse elemento e adicioná-lo à lista, algo como isto:

while( /*condição de paragem baseada no ficheiro, p.e. EOF ou uma marcação especial*/) {
lista *novo = (lista *) malloc( sizeof( lista ) );
  fscanf(fp, "%d\n%d\n%d\n%s\n%f\n%d\n%d\n%d\n", &novo->idcompra,&novo->codigocliente,&novo->codigoartigo,novo->artigo,&novo->preco,&novo->quantidade,&novo->data,&novo->paga);
p = insere(p, novo);

}

a função insere suponho que seja tipo isto: (esta insere no inicio, também se pode inserir no fim).

lista * insere(lista * lista, lista * novo){
novo->prox = lista;
lista->prev = novo;
novo->prev = NULL;
return novo;
}


XX SINFO - Semana Informática

Share this post


Link to post
Share on other sites
heavenheart

Ok eu percebi o que me tentaste transmitir mas so tenho um problema e que e a parte do while eu nao sei como fazer a paragem do while e se fosse arrays de registos tinha akeke numero no inicio ke dizia o total de registos e era so fazer um for mas aki eu nao faço a menor ideia como fazer isso com listas

// GUARDAR NORMAL COMPRAS
void guardarCompras(lista *pLista) 
{FILE * fp;
        char    strVazia = 's';
        lista   *p;
        p = pLista->prox;
fp = fopen("DadosCompras.txt","w");
fprintf(fp,"%d\n",TotalCC);
while(p != NULL)
{fprintf(fp,"%d\n%d\n%d\n%s\n%f\n%d\n%d\n%d\n",
   p->idcompra,p->codigocliente,p->codigoartigo,p->artigo,p->preco,p->quantidade,p->data,p->paga);
    p = p->prox;
}
fclose(fp);

}

Share this post


Link to post
Share on other sites
Diutsu

a condição do while não está relacionada com as listas, tens apenas verificar se vale a pena continuar a ler.

Isto é: se tiveres o número de elementos que queres ler:

int i = 0;
while(i < n_elementos){
....
i++;
}

se não tiveres verifica por EOF

while(fscanf(fp, "%d\n%d\n%d\n%s\n%f\n%d\n%d\n%d\n", novo->idcompra,&novo->codigocliente,&novo->codigoartigo,novo->artigo,&novo->preco,&novo->quantidade,&novo->data,&novo->paga) != EOF ) /* acho que é assim */
p = insere(p, novo);


XX SINFO - Semana Informática

Share this post


Link to post
Share on other sites
RSFalcon7

o scanf...

return the number of input items assigned.

só consegues saber o nr de coisas que ele conseguiu ler, que pode os que pediu, ou se houver erros (por exemplo letras nos ints) menos, ou zero, mas o zero pode ser EOF ou de erros.

eu uso sempre no scanf um espaço no começo da string, para limpar os buffers (http://publib.boulder.ibm.com/infocenter/tpfhelp/current/index.jsp?topic=/com.ibm.ztpf-ztpfdf.doc_put.cur/gtpc2/cpp_fscanf-scanf-sscanf.html)

Share this post


Link to post
Share on other sites
Localhost
só consegues saber o nr de coisas que ele conseguiu ler, que pode os que pediu, ou se houver erros (por exemplo letras nos ints) menos, ou zero, mas o zero pode ser EOF ou de erros.

atenção que EOF é diferente de 0. Pode-se testar isso facilmente.


here since 2009

Share this post


Link to post
Share on other sites
Diutsu
Return Value

On success, the function returns the number of items succesfully read. This count can match the expected number of readings or be less -even zero- in the case of a matching failure.

In the case of an input failure before any data could be successfully read, EOF is returned.

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

End-of-File

It is a macro constant definition. It expands to a negative integral constant expression.

It is used as the value returned by several <cstdio> functions to indicate failure, either because the End-of-File has been reached in a reading operation or because an error happened.

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

XX SINFO - Semana Informática

Share this post


Link to post
Share on other sites
Localhost

Ele afirmou que a função scanf podia retornar 0 (o que está correcto) e disse que esse 0 podia corresponder ao EOF (o que está errado).


here since 2009

Share this post


Link to post
Share on other sites
RSFalcon7

sim,

quando o scanf não consegue ler caracteres de uma stream (tanto do stdin, como ficheiros) ele bloqueia-se até conseguir ler, ora se ele ler um EOF ele já sabe que não vai ler mais nada, logo retorna erro para dizer que não conseguir ler aquilo que foi pedido.

fiz este pequeno programa para experimentar:

#include <stdio.h>

int main()	{

int result,x;

while(1)	{
	x=0;
	result = scanf(" %d",&x);
	printf("O scanf retornou %d leu: '%d'\n",result,x);
}

return 0;
}

Para enviar EOF em linux é Ctrl+D, em windows não sei...

Afinal, o valor de retorno quando ele chega ao EOF é -1

Share this post


Link to post
Share on other sites
Diutsu

dizes que é -1 porque compilando com o gcc dá -1, no entanto a regra é que dá uma constante inteira negativa.

Um exemplo foram uns colegas meus que tinham um erro no projecto, em que em todos os pc's que testaram dava funcionava, mas sempre que submetiam o projecto não passavam num teste automático: razão eles faziam (strcmp() == -1), compilando com o gcc isto é verdade, mas no compilador usado pelos professores já não, porque na especificação do strcmp apenas diz que dá valores <0,  0 ou >0.

Pode acontecer semelhante com o EOF, por isso nunca fiar que é -1.


XX SINFO - Semana Informática

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.