Ir ao conteúdo
  • Cadastre-se

Dúvidas em C usando arquivos


Marcia22

Posts recomendados

Estou fazendo um pequeno cadastro, alguns problemas surgiram ao inserir os dados em um arquivo.

Primeiro problema é que posso cadastrar vários nomes porém só o último que grava no orquivo. Só se eu fecho o o programa e compilo novamente, somente assim consigo gravar o próximo nome.

O outro problema é que os nomes gravam no arquivo cada vez com mais espaços.

Ex:

[esp] João

[espaço] Rafael

[espaço maior] Marcos

[espaço maior ainda] Mariana

Por favor, quem puder me ajude!

Segue o código abaixo:

#include<stdio.h>
#include<conio.h>

struct cadastro /* cria a estrutura cadastro e define suas variaveis */
{
char excluido;
char nome[30];
char cargo[20];
char sexo;
char cidade [30];
char estado [2];
int codigo;
int telefone;
int cpf;
int idade;
int salario;
};

struct cadastro cad; /* cria a variavel global cad do tipo estrutura
com todos os campos definidos em cadastro */

FILE *arqvDados = 0; //variavel ponteiro de arquivo

void listagem(struct cadastro* p)
{
printf("Nome:%s", p -> nome);
printf("\nPressione ENTER para continuar");
getch();
main();
}

void inclusao(struct cadastro cad )
{
printf("Digite o nome completo: ");
fflush(stdin);
gets(cad.nome);
/*Posicionar no final: */
fseek( arqvDados, 0, SEEK_END ); /*(nome do ponteiro do arquivo, numero de bytes q vai

caminhar, vai para o final)*/
/*gravar um registro:*/
fwrite( &cad, sizeof( struct cadastro ), 1, arqvDados ); /* &cad grava no endereco de cad */
printf("Nome cadastrado com sucesso, pressione ENTER para continuar.");
getch();
main();
}

void exclusao(void)
{
printf("EXCLUSAO.");
getch();
}

void alteracao(void)
{
printf("ALTERACAO.");
getch();
}

void menu(int opcao, struct cadastro cad)
{

switch(opcao)
{
case 1: inclusao(cad);
break;
case 2: exclusao();
break;
case 3: alteracao();
break;
// case 4: listagem(p);
// break;

}
}

main()
{
int opcao;
struct cadastro* p;
arqvDados = fopen( "c:\\temp1\\dados.dat","rb+" );
/* "rb+" Abre um arquivo binário para leitura e gravação. O arquivo deve existir e pode ser atualizado.*/

if( arqvDados == 0 )
{
arqvDados = fopen( "c:\\temp1\\dados.dat","wb+" );
/* "wb+" Abrir um arquivo binário para leitura e gravação. Se o arquivo existir ele será
destruído e reinicializado. Se não existir será criado. */
}

if ( arqvDados == 0 )
{
printf("Ocorreu um erro o arquivo nao pode ser aberto\n Tecle ENTER para sair");
getch();
exit(1);
}

p = &cad;
clrscr();
printf("CADASTRO\n");
printf("============================\n\n");
printf("\t\t 1 INCLUSAO\n\t\t 2 EXCLUSAO\n\t\t 3 ALTERAR\n\t\t 4 LISTAGEM\n\t\t 5 SAIR\n\n");
do
{
printf("Qual a sua opcao? ");
scanf("%d", &opcao);
if ((opcao < 1) || (opcao > 5))
{
printf("Opcao invalida. ");
}
else
{
menu(opcao,cad);
}
}
while ((opcao < 1) || (opcao > 5));
return 0;
}

Link para o comentário
Compartilhar em outros sites

Não faça chamadas à função main(). Retire todas as chamadas a função main().

Troque o seu:

while ((opcao < 1) || (opcao > 5));

por:

while (opcao != 5);

e reorganize seu menu.

fica + ou - assim:


// ...começo do código

do
{
clrscr();
printf("CADASTRO\n");
printf("============================\n\n");
printf("\t\t 1 INCLUSAO\n\t\t 2 EXCLUSAO\n\t\t 3 ALTERAR\n\t\t 4 LISTAGEM\n\t\t 5 SAIR\n\n");

printf("Qual a sua opcao? ");
scanf("%d", &opcao);
menu(opcao,cad);
}
while (opcao != 5);

// ... continuação do código

teste novamente...

Link para o comentário
Compartilhar em outros sites

Ok, entendi. Mas como faço para depois de cadastrar um nome, eu quero cadastrar outro, ou seja quero voltar para a parte do código que está no main(), sem chamar o main?

// ...começo do código

do
{
clrscr();
printf("CADASTRO\n");
printf("============================\n\n");
printf("\t\t 1 INCLUSAO\n\t\t 2 EXCLUSAO\n\t\t 3 ALTERAR\n\t\t 4 LISTAGEM\n\t\t 5 SAIR\n\n");

printf("Qual a sua opcao? ");
scanf("%d", &opcao);
menu(opcao,cad);
}
while (opcao != 5);

// ... continuação do código

Link para o comentário
Compartilhar em outros sites

Olá, Márcia.

Quando uma função é chamada em C, qualquer uma, ela é executada, comando por comando, e no final, o programa volta na linha seguinte à chamada da função.

A função MAIN é chamada somente uma vez, e pelo compilador, não pelo programador, de dentro do programa. Belez?

[]'s

Link para o comentário
Compartilhar em outros sites

Executei o programa com as modificações sugeridas pelo crudo e entendi. Realmente, não preciso chamar o main, e nem devo! O menu ficará "preso" pelo laço até que se digite 5 para sair, maravilha! Um problema foi resolvido!

Falta a formatação dos nomes gravados no arquivo. Por algum motivo eles saem com espaços na frente, quanto mais nomes são cadastrados mais espaços são adicionados na frente. Como citei antes:

[esp] João

[espaço] Rafael

[espaço maior] Marcos

[espaço maior ainda] Mariana

Não sei o que está causando isso.

Link para o comentário
Compartilhar em outros sites

Os espaços acontecem porque quando você salva sua ficha ele salva todos os dados que contém nela! nome, cargo, sexo, etc...

Mesmo que você não use alguns campos eles serão gravados com o conteúdo que tiverem. Isso quer dizer que se você não inicializar esses campos eles terão valores nulos ou "lixo".

Exemplo:

Quando você manda gravar a ficha do João, serão gravados vários bytes no seu arquivo, o sizeof (struct cadastro) diz quantos são esses bytes.

No caso da sua ficha, para cada novo registro são armazenados 94 bytes, que é a soma do que as variáveis ocupam: 30 bytes do nome + 20 bytes do cargo + 2 bytes do telefone + etc...

resumindo:

não se preocupe com os "espaços" quando você usar o fread() tudo ficará mais belo!

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...