0
I am making a program in c, which will read the records of a file and pass the name contained in the records to a double-chained list where they will be sorted alphabetically, and then with the help of the list the records of the file will be printed in order.
That is the code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct registro{
char matricula[5];
char nome[50];
char genero;
float salario;
char cargo;
char setor[2];
}registro;
typedef struct tiplista{
struct elem *inicio;
struct elem *fim;
}tiplista;
typedef struct elem{
char nome[50];
struct elem *ant;
struct elem *prox;
int pos; // posição do elemento no arquivo binário
}elem;
void insercao_lista_ordenada(tiplista *lista, char nome[50], int posicao){
elem *aux;
elem *novoelemento=(elem*)malloc(sizeof(elem));
strcpy(novoelemento->nome,nome);
novoelemento->prox= NULL;
novoelemento->ant= NULL;
novoelemento->pos=posicao;
if(lista->inicio == NULL){ //lista vazia
lista->inicio=novoelemento;
lista->fim=novoelemento;
}else{
aux = lista->inicio; // pont aux recebe o ponteiro do início da lista
while ((aux->prox != NULL) && (strcmp(aux->nome, nome) < 0))
{
aux = aux->prox;
}
// verificar se a inserção no início
if ((aux == lista->inicio) && ((strcmp(aux->nome, nome)) > 0))
{
novoelemento->prox = lista->inicio;
lista->inicio->ant = novoelemento;
lista->inicio = novoelemento;
}
else if ((strcmp(aux->nome, nome)) < 0) // elemento a ser inserido maior
{
// verificar se a inserção no final
if (aux == lista->fim)
{
novoelemento->ant = lista->fim;
lista->fim->prox = novoelemento;
lista->fim = novoelemento;
}
else // inserção no meio
{
novoelemento->ant = aux->ant;
aux->ant->prox = novoelemento;
novoelemento->prox = aux;
aux->ant = novoelemento;
}
}
}
return;
}
void imprimir_lista(tiplista *lista)
{
elem *aux;
registro reg;
FILE *arq_bin_p;
if((arq_bin_p=fopen("arq_bin_principal.bin","rb")) == NULL){
printf("Erro: não foi possível encontrar o arquivo.");
system("pause");
exit(1);
}
aux = lista->inicio;
while (aux != NULL) // percorre a lista
{
// posiciona o ponteiro do arquivo na posição do registro
fseek (arq_bin_p, aux->pos * sizeof(registro), SEEK_SET);
// faz a leitura do registro na posição
fread(®, sizeof(registro),1 , arq_bin_p);
printf("%s \n",reg.matricula);
printf("%s \n",reg.nome);
printf("%c \n",reg.genero);
printf("%f \n",reg.salario);
printf("%c \n",reg.cargo);
printf("%s \n\n",reg.setor);
aux = aux->prox; // avança para o próximo elemento da lista
}
}
int main(){
registro p[6],reg;
tiplista *lista=(tiplista*)malloc(sizeof(tiplista));
int pos=0;
lista->inicio=NULL;
lista->fim=NULL;
p[0]=(const registro){"15101","Carlos",'M',2500.00,'A',"02"};
p[1]=(const registro){"11256", "Ana", 'F', 1850.00, 'E', "01"};
p[2]=(const registro){"11436", "Roberto", 'M', 1550.00, 'A', "51"};
p[3]=(const registro){"11354", "José", 'M' ,1350.00, 'D', "04"};
p[4]=(const registro){"12542", "Elaine", 'F', 2750.00, 'B', "22"};
p[5]=(const registro){"00812", "Murilo", 'M', 3500.00, 'E', "01"};
FILE *arq_bin_p=fopen("arq_bin_principal.bin","wb");
fwrite(p, sizeof(registro),6,arq_bin_p);
fclose(arq_bin_p);
if((arq_bin_p=fopen("arq_bin_principal.bin","rb")) == NULL){
printf("Erro: não foi possível encontrar o arquivo.");
system("pause");
exit(1);
}
while(fread(®,sizeof(registro),1,arq_bin_p)){
insercao_lista_ordenada(lista,reg.nome,pos);
pos++;
}
fclose(arq_bin_p);
imprimir_lista(lista);
system("pause");
return 0;
}
The problem is that when compiling this program it only prints 3 of the 6 records of the file, and somehow "reg.matricula" this storing the matricula and the name together. What I am missing?
It helped a lot, vlw!!
– Cleber