3
I have these three structs:
typedef struct {
char codigopaciente[10];
char nome[50];
char telefone[50];
int idade;
char sexo;
} paciente;
typedef struct {
char codigomedico[10];
char nome[50];
char especialidade[50];
float valorconsulta;
} medico;
typedef struct {
char codigopaciente[10];
char codigomedico[10];
char dataconsulta[10];
char diadasemana[10];
} consulta;
Hence, I use this code in main:
arquivo1 = fopen("medico.dat", "r");
// Se o arquivo for vazio, a memória é alocada.
if (arquivo1 == NULL) {
printf("Quantos medicos voce deseja cadastrar?\n");
scanf("%d", &quantidade_medicos);
m = malloc(quantidade_medicos * sizeof(medico));
medicos_cadastrados = 0;
// Se o arquivo não for vazio, a memória é alocada junto com os registros presentes no arquivo.
} else {
fread(&quantidade_arquivo, sizeof(int), 1, arquivo1);
printf("Existem %d medicos nesse arquivo. Quantos mais voce precisa cadastrar?\n", quantidade_arquivo);
scanf("%d", &quantidade_medicos);
quantidade_medicos = quantidade_medicos + quantidade_arquivo;
m = malloc(quantidade_medicos * sizeof(medico));
quantidade_medicos = quantidade_arquivo;
fread(m, sizeof(medico), quantidade_arquivo, arquivo1);
fclose(arquivo1);
}
(the code is similar to the two files of the other structs)
And then, when the program is to be closed and all the writing operations have been done, I use this code:
arquivo1 = fopen("medico.dat", "w");
fwrite(&medicos_cadastrados, sizeof(int), 1, arquivo1);
fwrite(m, sizeof(medico), (medicos_cadastrados), arquivo1);
free(m);
fclose(arquivo1);
arquivo2 = fopen("paciente.dat", "w");
fwrite(&pacientes_cadastrados, sizeof(int), 1, arquivo2);
fwrite(p, sizeof(paciente), (pacientes_cadastrados), arquivo2);
free(p);
fclose(arquivo2);
arquivo3 = fopen("consulta.dat", "w");
fwrite(&consultas_cadastradas, sizeof(int), 1, arquivo3);
fwrite(c, sizeof(consulta), (consultas_cadastradas), arquivo3);
free(c);
fclose(arquivo3);
I already used the same technique in another exercise and the generated files were not "readable" in a text editor, however, the program could recover the data correctly. However, in this specific code, the data is partially recovered.
What might be going on in this case?
It worked perfectly. But I was curious because I had cases where it worked with
r
and withw
normally and in others gave problem.– athosbr99
@athosbr99 Probably because in most cases the result is the same in any mode, either text or binary. But in some, the result is different. In particular, line-break characters (
\r
and\n
) has different treatment between text mode and binary mode. When represented as numbers, they are 13 and 10, respectively.– Victor Stafusa