C, exercício de análise

assunto: vetor dinâmico de estruturas, ficheiro de texto, ficheiro binário

pergunta: Um banco armazena num ficheiro binário informação sobre os seus clientes. Os dados de cada cliente são guardados em estruturas do tipo pessoa. Além disso, um ficheiro de texto tem armazenados vários valores inteiros relativos a alguns números de conta (um inteiro em cada linha). Escreva uma função que crie um vetor dinâmico de estruturas do tipo pessoa, para onde devem ser copiadas todas as estruturas do ficheiro que não têm um número de conta que surja no ficheiro de texto. A função tem o seguinte protótipo:
pessoa* criaVetor(char* nomeB, char* nomeF, int *total);
Recebe como parâmetros os nomes dos ficheiros e o endereço de uma variável inteira onde deve colocar o tamanho do vetor criado. Devolve o endereço inicial do vetor dinâmico. Se ocorrer algum erro, deve devolver NULL.
Ao responder a esta questão, não deve assumir que a ordem pela qual a informação surge nos 2 ficheiros é igual. Além disso, podem surgir números de conta no ficheiro de texto que não se encontram nas estruturas do ficheiro binário.

typedef struct cliente pessoa;
struct cliente{
    char nome[200];      // Nome do cliente
    char morada[200];    // Morada do cliente
    int nConta;         // Número de conta
    int montante;       // Saldo da conta
};

resposta:

pessoa* criaVetor(char* nomeB, char* nomeF, int *total) {
    FILE *f, *g;
    int n = 0, i, flag;
    int tab[n], *auxT;
    pessoa clt[*total], *auxC, *lista;
    *total = 0;
    lista = &clt[*total];
    f = fopen(nomeB, "rb");
    if(f == NULL) {
        printf("Erro a abrir para leitura o ficheiro binario [%s]\n", nomeB);
        return NULL;
    }
    g = fopen(nomeF, "rt");
    if(g == NULL) {
        printf("Erro a abrir para leitura o ficheiro de texto [%s]\n", nomeF);
        fclose(f);
        return NULL;
    }
    auxT = malloc(sizeof(int));
    if(auxT == NULL) {
        printf("Erro na alocacao de memoria\n");
        return NULL;
    }
    while(fscanf(g, "%d", auxT) == 1) {
        tab[n] = *auxT;
        n++;
        auxT = malloc(sizeof(int));
        if(auxT == NULL) {
            printf("Erro na alocacao de memoria\n");
            return NULL;
        }
        tab[n] = *auxT;     
    }
    auxC = malloc(sizeof(pessoa));
    if(auxC = NULL) {
        printf("Erro na alocacao de memoria\n");
        return NULL;
    }
    while(fread(auxC, sizeof(pessoa), 1, f) == 1) {
        flag = 1;
        for(i = 0; i < n; i++)
            if(auxC->nConta == tab[i]) {
                flag = 0;
                break;
            }
        if(flag == 1) {
            clt[*total] = *auxC;
            (*total)++;
            auxC = malloc(sizeof(pessoa));
                if(auxC = NULL) {
                    printf("Erro na alocacao de memoria\n");
                    return NULL;
                }
        }
    }
    return lista;
}

Tags : , ,

0 thoughts on “C, exercício de análise”

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.