Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
Marcia22

Dúvidas em C usando arquivos

Recommended Posts

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;
}

Compartilhar este post


Link para o post
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...

Editado por crudo

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
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.

Compartilhar este post


Link para o post
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!

Editado por crudo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendi, muito abrigada crudo!

Agradeço pela aula!

Obrigada ao Maurício também!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário






Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

×