Jump to content
andrepcg

Ler de um ficheiro e carregar para estrutura de listas ligadas [Need Help!]

Recommended Posts

andrepcg

Primeiro quero explicar o objectivo e depois passo ao código que espero que me consigam ajudar a completar.

Objectivo: Ler informação de um ficheiro txt devidamente formatado com estrutura de informação conhecida e carregar esses dados para uma lista ligada. É para um projecto que estou a realizar que tem a ver com gestão de emprestimos e reservas de livros de uma biblioteca

Formato do ficheiro: Cada linha do ficheiro segue esta estrutura: 1 Andre 2 0 5 13 05 2011 4 13 05 2011

O primeiro digito (1) representa o id de um utilizador.

A palavra (Andre) representa o nome desse utilizador.

O conjunto dos digitos 2 0 subdivide-se: o primeiro (2) representa o numero de livros que esse utilizador "levou para casa" (ou seja, levou 2 livros) e o segundo (0 zero) representa o numero de reservas que fez (ou seja, não reservou nada).

A parte a azul são os livros que "levou para casa" em que o primeiro algarismo (5) é o id desse livro, e os 3 restantes são a data da reserva, e esta sequência de 4 algarismos (id dia mes ano) repete-se de acordo com o primeiro digito da parte laranja (2 0). Quando o programa está a ler o ficheiro ele guardava o algarismo 2 e depois sabia que tinha que ler aquela sequência de 4 algarismos para um determinado sitio e fazer isso quantas vezes está lá a dizer (neste caso duas vezes).

O 2º algarismo da parte a laranja (2 0) representa o numero de reservas que esse utilizador fez. Com não tem reservas (0 zero), o programa sabe que não tem de ler nada.

Exemplo de uma linha com "livros levados para casa" e reservas: 1 Andre 2 2 5 13 05 2011 4 13 05 2011 1 13 05 2011 7 13 05 2011

A parte a castanho segue a mesma estrutura dos "livros levados para casa" (id dia mes ano) mas em vez de ser para "levados para casa" representa o id do livro que reservou e a data da reserva.

Portanto, preciso que me ajudem na parte de ler a informação do ficheiro mas neste momento apenas para umas arrays e depois mais à frente implemento listas ligadas.

O que tenho ate agora é isto:

void ler_ficheiro()
{
    FILE *file;
    file=fopen("utentes.txt", "r");

    int id[10];
    char nomes[10][64];
    int livros_num[10][2];
    int livros[10][4];

    if(file!=NULL)
    {
        int i=0;
        while (!feof(file))
        {
            int y;
            fscanf(file, "%d %s %d %d", &id[i],&nomes[i],&livros_num[i][0],&livros_num[i][1]);
        }
        int x;
        for(x=0;x<i;x++)
        {
            printf("%d %s %d %d\n", id[x],nomes[x],livros_num[x][0],livros_num[x][1]);
        }

    }
    else
    {
        printf("Erro ao abrir o ficheiro.");
    }
}

A minha duvida principal é fazer o scan funcionar de acordo com a parte laranja (2 0). A linha é fixa para os 4 primeiros itens (fscanf(file, "%d %s %d %d", &id,&nomes,&livros_num[0],&livros_num[1]);) mas depois, de acordo com o valor que foi lido para livros_num[0] e livros_num[1] ele tem que ler %d %d %d %d  x vezes o valor de livros_num[0], nessa mesma linha.

Se ele ler o valor 2 para &livros_num[0], o programa sabe que tem que ler 2 vezes este conjunto de dados %d %d %d %d, nessa mesma linha. Segundo o exemplo, como foi lido 0 zero para livros_num[1] o programa sabe que depois de ter lido 2 vezes %d %d %d %d, não tem de ler mais nada a seguir


Manda piadas secas por telefone - Piadas.secas.club

Share this post


Link to post
Share on other sites
KTachyon

Parece-me que estás a pensar bem, não estou a ver qual é a dúvida.

Se fizeres:

int x = 0;

for (int i = 0; i < x; i++) {
  //...
}

O que está no loop nunca vai ser executado, logo nunca vais ter problemas com zeros nessa situação.


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

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.