Ir para conteúdo
Fórum Script Brasil
  • 0

Problema em excluir dados e renomear arquivo


Carlos Telles

Pergunta

Meu professor passou um trabalho, aonde eles pede as seguintes funções:

Exibir o seguinte menu:

Escolha a opção:

1 - Cadastrar (minimo 5 campos)

2 - Listar

3 - Pesquisar

4 - Excluir todos

5 - Excluir Item

6 - Alterar

7 - Confirmar

0 - Sair

=====================

PS: o Arquivo tem que ser em formato.dat

1 - Preencher dados de um item do seu assunto (formato Registro) gravar um arquivo (sem excluir outros registros). OK

2 - Ler todos os registros cadastrados OK

Ler registro

Exibir dados do registro

Caso não tenha registro, exibir que não possui registros

3 - Pesquisar usando um dos campos OK

Se encontrou: Exibir dados

Caso contrário: Exibir não encontrado

4 - Excluir apenas um Registro

Se encontrado o registro: Exibir dados e perguntar se realmente deseja excluir

Caso contrario: Exibir não encontrado

5 - Excluir todos os dados do arquivo. OK

6 - Alterar (modificar alguma informação já salva) OK

7 - Confirgurar (Alterar o nome do arquivo.)

0- sair OK

Estou fazendo um programa de locadora de dvd e blu-ray e tendo muitos problemas para fazer 2 funções: a 4 e a 7 que é Excluir um registro e Renomear o arquivo(aonde todos os registros estão salvos), não posso usar ponteiros, e devo usar struct, a linguagem usada é C e o compilador Dev C++, vou postar o codigo do que eu fiz, tentei ao máximo fazer sozinho, mas infelizmente não consegui, fiz besteira em não pedir ajuda antes, já que a entrega é pra amanhã, caso alguém possa me dar uma ajuda ficarei muito grato.

Codigo:[\b]

#include<stdio.h>
#include<conio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>

   int menu;
   //Estrutura do Registro
   struct pad_video
   {
   char genero[50],nome[50],tipo[50],codigo[50],anolancamento[50];
   };
   
  
//FUNÇÃO CADASTRAR
  int cadastrar()
  
  {
  
  struct pad_video midia;
  FILE * arq; 
  arq = fopen("registro.dat","a+");

     printf("\nDigite o nome: "); 
     gets(midia.nome);

     printf("Digite o genero do filme: ");
     gets(midia.genero);
     
     printf("Digite o tipo de midia [DVD | Bluray] : ");
     gets(midia.tipo);
     
     printf("Digite o ano de Lancamento: "); 
     gets(midia.anolancamento);
     
     printf("Digite o codigo: "); 
     gets(midia.codigo);

     fwrite(&midia,sizeof(struct pad_video),1,arq);

     fclose (arq);

}

// FIM DA FUNÇÃO CADASTRAR
     
     
//FUNÇÃO LISTAR

int listar()
{   
    int retorno,cont=0;
    struct pad_video midia;
    FILE * arq;
    if ((arq = fopen("registro.dat","r+b")) == NULL)
    {
                 printf(" \n Registro não existe !");
                 getch();
    }
    

    retorno = fread(&midia,sizeof(struct pad_video),1,arq);

while ( retorno == 1) 
{
      cont++;
      printf("\n Nome: %s",midia.nome);
      printf("\n Genero: %s",midia.genero);
      printf("\n Tipo: %s",midia.tipo);
      printf("\n Ano de Lacamento: %s",midia.anolancamento);
      printf("\n Codigo: %s\n",midia.codigo);
      retorno = fread(&midia,sizeof(struct pad_video),1,arq);
}
      printf("\n FILMES CADASTRADOS: %d",cont);
      fclose (arq);
}

//FIM DA FUNÇÃO LISTAR


//FUNÇÃO BUSCAR

int busca()

{
    int achou=-1, posicao=0;
    char nomep[40];
    struct pad_video midia;
    FILE * arq;
    arq = fopen("registro.dat","r+b");
    printf("\nDigite [nome] para ser pesquisado :");
        gets(nomep);
    rewind(arq);
    while ((!feof(arq)) && (achou==-1))
    {
        fread(&midia,sizeof(struct pad_video),1,arq);
        if(!feof(arq)){
            if(strcmp(nomep,midia.nome)==0){
                achou=1;
            }
            else 
            posicao++;
        }
        else 
        posicao=-1;
    }
    fclose(arq);
    return(posicao);

}

//FIM DA FUNÇÃO BUSCAR
     
// FUNÇÃO EXIBIR RESULTADO DA BUSCA
int pesquisar()
{
    struct pad_video midia;
    FILE * arq;
    arq = fopen("registro.dat","r+b");
    int pos;
    pos=busca();
    if(pos==-1){
        printf("\nNao Encontrado!");
        getchar();
    }
    else{
        if(pos==-2)
        {
            printf("\nNome excluido do arquivo!");
            getchar();
        }
        else{
            fseek(arq,pos*sizeof(struct pad_video),SEEK_SET);
            fread(&midia,sizeof(struct pad_video),1,arq);
            printf("Posicao do Filme  Cadastrado: %d ", pos);
            printf("\nResultado da Pesquisa: ");
            printf("\n\n Nome: %s",midia.nome);
            printf("\n Genero: %s",midia.genero);
            printf("\n Tipo: %s",midia.tipo);
            printf("\n Ano de Lancamento: %s",midia.anolancamento);
            printf("\n Codigo: %s",midia.codigo);
        }

    fclose(arq);
}
}
// FIM FUNÇÃO EXIBIR RESULTADO DA BUSCA




//FUNÇÃO EXCLUIR SOMENTE UM REGISTRO
//NÃO CONSEGUI FAZER




// FUNÇÃO PARA EXCLUIR TODOS
int excluirtodos()
{
    int op;
    printf("Deseja Realmente excluir todos?\n [1-Sim ou 2-não]: ");
    scanf("%d",&op);
    if (op == 1){
    struct pad_video midia;
    FILE * arq;
    arq = fopen("registro.dat","w");
    printf("Todos excluidos com Exito!");         
    fclose(arq);
        }
            getch();
    }

//FIM FUNÇÃO EXCLUIR TODOS


// FUNÇÃO ALTERAR REGISTROS    
int alterar()
{
    struct pad_video midia;
    FILE * arq;
    arq = fopen("registro.dat","rb+");          
    int pos;
    pos=busca();
    if(pos==-1){
        printf("\n Não encontrado! ");
        getch();
    }
    else{
        if(pos==-2){
            printf("\nNome excluido do arquivo!");
        }
        else{
            fseek(arq,pos*sizeof(struct pad_video),SEEK_CUR);
            fread(&midia,sizeof(struct pad_video),1,arq);
            printf("Posicao do Filme  Cadastrado: %d ", pos);
            printf("\nResultado da Pesquisa: ");
            printf("\n\n Nome: %s",midia.nome);
            printf("\n Genero: %s",midia.genero);
            printf("\n Tipo: %s",midia.tipo);
            printf("\n Ano de Lancamento: %s",midia.anolancamento);
            printf("\n Codigo: %s",midia.codigo);
        }
        printf("\n\nAlterar o nome para: "); 
        gets(midia.nome);
        printf("Alterar o genero do filme para: ");
        gets(midia.genero);
        printf("Alterar o tipo de midia [DVD | Bluray] para: ");
        gets(midia.tipo);
        printf("Alterar o ano de Lancamento para: "); 
        scanf("%d",&midia.anolancamento);
        printf("Alterar o codigo para: "); 
        scanf("%d",&midia.codigo);
        fseek(arq,pos*sizeof(struct pad_video),SEEK_SET);
        if(fwrite(&midia,sizeof(struct pad_video),1,arq)!=1)
        {
            printf("Erro na gravacao!");
        }
        else{
            printf("\nAlterado com sucesso!");
        }
        fclose(arq);
    }
}

//FIM DA FUNÇÃO ALTERAR REGISTROS

//FUNÇÃO ALTERAR O NOME DO ARUIVO (AONDE TODOS OS REGISTROS ESTÃO SALVOS)
//NÃO CONSEGUI FAZER    

main()
{
   
   do{ 
   printf("\n\n\n====================================\n");
      printf("1 - Cadastrar\n");
      printf("2 - Listar\n");
      printf("3 - Pesquisar\n");
      printf("4 - Excluir\n");
      printf("5 - Excluit Todos\n");
      printf("6 - Alterar\n"); 
      printf("0 - Sair\n");
      printf("====================================");
      
      printf("\nDigite a alternativa desejada: ");    
      scanf("%d",&menu); 
      
      if(menu==1)
      {
        cadastrar();        
      }
      if(menu==2)
      {
        listar();        
      }
      if(menu==3)
      {
        pesquisar();        
      }
      if(menu==4)
      {
        pesquisar(); //LOCAL DA FUNÇÃO EXCLUIR UM UNICO REGISTRO COLOQUEI PESQUISAR SOMENTE PARA TESTAR        
      }
      if(menu==5)
      {
        excluirtodos();        
      }
      if(menu==6)
      {
        alterar();        
      }

            if(menu==7)
      {
        pesquisar();// LOCAL DA FUNÇÃO RENOMEAR O NOME DO ARQUIVO (que salva todos os registro)        
      }
      
   }
   while(menu!=0);          
   getch();
     
     
}

Editado por Carlos Telles
Link para o comentário
Compartilhar em outros sites

9 respostass a esta questão

Posts Recomendados

  • 0

Carlos,

Realmente você poderia ter ido postando as dúvidas aí um pouco mais cedo, tem muita coisa a ser feita aí.

struct pad_video midia;
  FILE * arq; 
  arq = fopen("registro.dat","a+");

[b]     getchar(); //Coloca esse getchar porque o programa está pulando o nome do filme[/b]

     printf("\nDigite o nome: "); 
     gets(midia.nome);

     printf("Digite o genero do filme: ");
     gets(midia.genero);
     
     printf("Digite o tipo de midia [DVD | Bluray] : ");
     gets(midia.tipo);
     
     printf("Digite o ano de Lancamento: "); 
     gets(midia.anolancamento);
     
     printf("Digite o codigo: "); 
     gets(midia.codigo);

     fwrite(&midia,sizeof(struct pad_video),1,arq);

     fclose (arq);

Depois posto mais coisas aí na medida que tiver tempo para olhar.

Link para o comentário
Compartilhar em outros sites

  • 0

Já vou adiantando uma das suas dúvidas.

Com relação à renomear basta usar o system.

Você está trabalhando no windows ou linux? faz assim:

system( "mv registro.dat reg.dat" ); // Comando em linux

system( "ren registro.dat reg.dat" ); // windows... bem... eu acho né.. não trabalho com ruindows... :p
Mas tipo esse exemplo é estático né, se você quiser pode montar também tipo para o cara entrar com novo nome
char comando[50];
char novoNome[20];

printf("Novo nome do arquivo: " );
gets("%s", novoNome );

strcpy( comando, "mv registro.dat " ); //Usa o mv ou ren... não esqueça de deixar um espaço no final 

strcat( comando, novoNome ); // Agora temos o comando completo

system( comando );

Depois posto mais...

Editado por webpantoja
Link para o comentário
Compartilhar em outros sites

  • 0

Eu uso o windows, obrigado , vou testar aqui.

Testei, coloquei os comandos na função renomear:

//FUNÇÃO ALTERAR O NOME DO ARUIVO (AONDE TODOS OS REGISTROS ESTÃO SALVOS)

int renomear ()
{
     char comando[50];
     char novoNome[20];

     printf("Digite o novo nome do arquivo: " );
     gets("%s", novoNome );

     strcpy( comando, "mv registro.dat " ); //Usa o mv ou ren... não esqueça de deixar um espaço no final

     strcat( comando, novoNome ); // Agora temos o comando completo
     system( comando );
}

// FIM FUNÇÃO ALTERAR O NOME DO ARUIVO (AONDE TODOS OS REGISTROS ESTÃO SALVOS)

Mas deu os seguntes erros:

C:\Dev-Cpp\include\stdio.h In function `int renomear()':

242 C:\Dev-Cpp\include\stdio.h too many arguments to function `char* gets(char*)'

240 C:\Users\Carlos\Desktop\Trabalho c P2.cpp at this point in file

e abriu a biblioteca stdio.h.

Obrigado pela dica do getchar();, na faculdade pulava o nome, aqui rodava normalmente, agora já sei como resolver.

Editado por Carlos Telles
Link para o comentário
Compartilhar em outros sites

  • 0

Sim, eu testei com o ren também, o programa roda mas diz que a sintaxe do comando está incorreta. Deve ser algum problema de biblioteca aqui.

resolvi parcialmente:

strcpy("rename registro.dat",comando);

Quando vou digitar o nome do novo arquivo dá erro e fecha, mas de boa o professor vai ter que aceitar. Valeu ai ajudou muito.

O problema agora é com o excluir um unico registro.

Editado por Carlos Telles
Link para o comentário
Compartilhar em outros sites

  • 0

Quando você digita o nome do novo arquivo, está colocando a extensão .dat? tem que colocar... Aqui no linux funcionou, aí no windows pode estar dando alguma diferença...

Com relação à exclusão do registro não existe nada que você possa fazer para excluir logo de cara... temos então duas soluções:

1- Você cria mais uma variável dentro da sua estrutura (pode ser tipo uma flag). Aí quando você cria um registro novo você marca ela com 1. Quando você for excluir o registro você somente localiza qual registro é e seta ela com 0. Aí na hora de listar seus registros você mostra na tela somente os registros com a flag 1 setada.. lol hehehe

2- Você cria um tmp.dat temporário. Você faz um for para passar por todo seu registro e vai copiando os registros para o tmp.dat. Quando chegar no registro que tem que apagar você não copia ele no tmp.dat. No final você exclui o arquivo tmp.dat com um remove e move o tmp.dat para o nome do registro apagado. Pronto!

Cara a solução 1 é meio um gato... mas ela é a mais fácil de se fazer em um curto prazo. A 2 seria mais completa, apesar de parecer meio lusitano.. bem essas são as dicas que tenho. Tomara que tenha ajudado.

Att,

WebPantoja

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...