How to Save Read Chained List in File?

Asked

Viewed 7,557 times

2

I’m a beginner in programming and I’m coding this program for a college job.

It is a "pizzeria manager", I need to save read a linked list (customer registration) in a file, so that the data is not lost when the program is closed.

But how can I do it ?

  • 1

    The question is about how to read/write to a file, or how to serialize/deserialize the chained list to write as text?

  • It would be important also you [Dit] the question to show how you structured your chained list in the program.

2 answers

2

You can write the data in a vector or in a Struct, depends on the implementation you will do, put some references at the end of the answer.

see an example of how to write an array of integers in the file

 #include <stdio.h>

    main() {
        FILE *arq;
        // Esses dados vão ser gravados !
        int ret, vet[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
        // arquivo alvo
        char nomearq[] = "vet.dat";
        // arquivo tem que ter permissão w para escrita e b para abrir como binario
        arq = fopen(nomearq, "wb");
        if (arq != NULL) {
            // aqui é feita a escrita !!
            ret = fwrite(vet, sizeof(int), 10, arq);
            if (ret == 10)
                printf("Gravacao com sucesso\n");
            else
                printf("Foram gravados apenas %d elementos\n", ret);
            fclose(arq);
        }
        else
            puts("Erro: criacao do arquivo");
    }

You can recover the data written in the first example in this way

 #include <stdio.h>

    main() {
        FILE *arq;
        int i, ret, vet[10];
        char nomearq[] = "vet.dat";

        arq = fopen(nomearq, "rb");
        if (arq != NULL) {
            // estou recuperando AQUI
            ret = fread(vet, sizeof(int), 10, arq);
            if (ret == 10) {
                printf("Elementos: ");
                for (i = 0; i < 10; i++)
                    printf("%d ", vet[i]);
            }
            else
                printf("Foram lidos apenas %d elementos\n", ret);
            fclose(arq);
        }
        else
            puts("Erro: abertura do arquivo");
    }

You can save more complex structures using struct, example

#include <stdio.h>

    const int na = 6;

    typedef struct {
        char nome[10];
        int nota;
    } tp_aluno;

main() {
    tp_aluno alunos[] = {{"Luiz", 5}, {"Paulo", 5}, {"Maria", 3},
                         {"Luiza", 4}, {"Felipe", 8}, {"Fabiana", 6}};
    int ret;
    FILE *arq;
    char nomearq[] = "turma.dat";
    arq = fopen(nomearq, "wb");
    if (arq != NULL) {
        ret = fwrite(alunos, sizeof(tp_aluno), na, arq);
        if (ret == na)
            printf("Gravacao %d registros com sucesso\n", ret);
        else
            printf("Foram gravados apenas %d elementos\n", ret);
        fclose(arq);
    }
    else
        puts("Erro: abertura do arquivo");
}

To recover the data you can do so

#include <stdio.h>

    const int na = 6;

    typedef struct {
        char nome[10];
        int nota;
    } tp_aluno;

main() {
    tp_aluno alunos[na];
    int i, ret;
    FILE *arq;
    char nomearq[] = "turma.dat";

    arq = fopen(nomearq, "rb");
    if (arq != NULL) {
        ret = fread(alunos, sizeof(tp_aluno), na, arq);
        if (ret == na) {
            printf("Lidos %d registros com sucesso\n", ret);
            for (i = 0; i < ret; i++)
                printf("%s %d\n", alunos[i].nome, alunos[i].nota);
        }
        else
            printf("Foram lidos apenas %d elementos\n", ret);
        fclose(arq);
    }
    else
        puts("Erro: abertura do arquivo");
}

Like all college work, it requires research and effort, you can consult the commands files and Struct

1

You can try using a function similar to the one shown below:

/**
 * Insere um novo registro no arquivo especificado. A função SEMPRE 
 * insere o novo registro no final do arquivo, assim os dados
 * anteriores sempre são preservados.
 *
 * @param char *file string com o nome do arquivo que você quer inserir.
 * @param void *data struct com os dados que você deseja inserir.
 * @param size_t len tamanho da struct com os dados a inserir.
 * @return  void
 *
 * @example para usar essa função basta chamá-la da seguinte forma:
 * fileInsert("ArquivoInserido.dat", &structComDados, sizeof(structComDados));
 * 
 * @author Renato Tavares <[email protected]>
 * @version   1.0
 *
 */

void fileInsert(char *file, void *data, size_t len) {

    FILE *filePtr;

    if ((filePtr = fopen(file, "rb+")) == NULL) {
        printf("Arquivo %s não pode ser aberto.", file);
        exit(EPERM);

    } else {

        fseek(filePtr, 0L, SEEK_END);
        fwrite(data, len, 1, filePtr);
        fclose(filePtr);
    }
}

It’s also a college job, in this gits you can find the complete set of functions, quite something already ready and even well documented.

https://gist.github.com/RenatoTavares/7834642

  • And to read the data?

Browser other questions tagged

You are not signed in. Login or sign up in order to post.