I'm very new to programming and I'm coding this program for a college job.
It is a "pizzeria manager", I need to save \ a linked list (customer list) in a file, so that the data is not lost when the program is closed.
But how can I do this?
I'm very new to programming and I'm coding this program for a college job.
It is a "pizzeria manager", I need to save \ a linked list (customer list) in a file, so that the data is not lost when the program is closed.
But how can I do this?
You can write the data in a vector or in a Struct, it depends on the implementation you are going to make, I put some references at the end of the answer.
See an example of how to write an integer vector 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 retrieve 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 look up commands files and Struct
You can try using a function similar to the one 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 a thing already ready and even well documented.