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

[Dúvida] Arquivos em disco em C


d3j4_Vu

Pergunta

Fiz um program de cadastro de livros em C usando arquivos em disco. Mas estou com problemas pra implementar uma função que "apague" um registro do arquivo.

A função recebe uma string(nome do livro), dae tenho que procurar o nome do livro no arquivo e se achar, deletar na seguinte ordem:

deletar linha 1 - NOME do livro encontrado

deletar linha 2 - GENERO do livro encontrado

deletar linha 3 - AUTOR do livro encontrado

Mas não to conseguindo fazer...alguém pode me ajudar??

(Não é exercício de faculdade ou curso, é um programa que estou tentando fazer por conta pra aprender e outras coisas mais)

Tentei fazer a função para apagar arquivos do disco mas não esta dando certo. Cadas registro ocupa 3 linhas sendo o nome na primeira linha, o genero na segunda linha e o autor na terceira linha. Dae se eu achar um nome de livro igual ao que o usuário quer apagar, eu deleto as 3 linhas ligadas ao nome do livro encontrado. Função que tentei implementar:

void apagar_livro( char FLivro[TAM] )
{
   FILE *estrutura;
   estrutura = fopen("banco.txt","a");
   char Temporaria[TAM];
   char *Vazio = " ";
   int Deletou = 0;
   long teste;

   while ( (fscanf(estrutura," %s",Temporaria)) != EOF )
   {
      if (!strcmp(Temporaria,FLivro))
      {
         fprintf(estrutura,"%s",Vazio); // apaga nome
         fprintf(estrutura,"%s",Vazio); // apaga genero
         fprintf(estrutura,"%s",Vazio); // apaga autor
         printf("\n Livro apagado com sucesso");
         system("pause>nul");
         Deletou = 1;
      }
      else
      fscanf(estrutura,"\n");
   }
   if ( Deletou == 0 )
   {
      printf("\n Livro \" %s \" não foi deletado",FLivro);
      system("pause>nul");
   }
   
   system("cls");
   fclose(estrutura);
}
E tenho uma dúvida: a função fscanf quando trabalha com um while e EOF, como no exemplo abaixo, sozinha com o loop ela passa de linha cada vez que é chamada? Ex:
while ( (fscanf(estrutura," %s",Temporaria)) != EOF )
E o código completo do meu cadastro de livro. É coisa simples q estou fazendo, mas estou com problema na parte de deletar os registros
#include <stdio.h>

#define TAM 30

// Função que insere registros no arquivo

void inserir_dados(char FNome[TAM],
                   char FGenero[TAM],
                   char FAutor[TAM])
{
   // cria um arquivo de ponteiro
   FILE *estrutura;

   // abre o arquivo para inserção
   // se não houver arquivo cria-se, senão é inserido ao final do arquivo
   // um novo registro
   estrutura = fopen("banco.txt","a");

   // grava no arquivo nome do livro e pula uma linha
   fprintf(estrutura,"%s\n",FNome);
   // grava no arquivo o genero do livro e pula uma linha
   fprintf(estrutura,"%s\n",FGenero);
   // grava no arquivo o autor do livro e pula uma linha
   fprintf(estrutura,"%s\n",FAutor);

   // escreve na na tela o que foi inserido
   fprintf(stdout,"\n Livro: %s"
                  "\n Genero: %s"
                  "\n Autor: %s"
                  "\n Cadastro inserido corretamente\n",FNome,FGenero,FAutor);

   // aguarda uma tecla
   getchar();
   getchar();
   system("cls");

   // fecha o arquivo
   fclose(estrutura);
}

void pesquisar_livro( char FNomePesquisa[TAM] )
{
   // cria um ponteiro de arquivo
   FILE *estrutura;

   // ponteiro para guardar uma string lida do arquivo
   char Temporaria[TAM];

   // variaveis correspondentes a campos do cadastro de um livro
   char FGenero[TAM],   // armazena genero do arquivo a ser lido
        FAutor[TAM];    // armazena autor do arquivo a ser lido

   // variavel que serve pra chegar se achou registro ou não
   int Leu = 0;

   // abre o arquivo para leitura
   estrutura = fopen("banco.txt","r");

   // pega a linha atual e analisa se é final de arquivo
   // se não for final de arquivo, compara com a string passada para pesquisa
   while ( (fscanf(estrutura," %s",Temporaria)) != EOF )
   {
      // se a linha do nome do livro atual for igual à da pesquisa
      if (!strcmp(Temporaria,FNomePesquisa))
      {
         // imprime nome que esta na primeira linha lida do arquivo
         fprintf(stdout,"Nome: %s",Temporaria);
         // pula uma linha no arquivo e armazena o genero do livro
         fscanf(estrutura,"\n%s",FGenero);
         // imprime o genero do livro atual
         fprintf(stdout,"\nGenero: %s",FGenero);
         // pula uma linha no arquivo e armazena o autor do livro
         fscanf(estrutura,"\n%s",FAutor);
         // imprime o autor do livro atual
         fprintf(stdout,"\nAutor: %s\n",FAutor);
         // pula uma linha para ir para o próxima registro
         fscanf(estrutura,"\n");
         
         // 1 = Indica que foi encontrado livro
         // 0 = Indica que não foi encontrado livro
         Leu = 1;
      } 
      // se não encontrar no registro atual,
      else
      {

         // pula uma linha
         fscanf(estrutura,"\n");
      }
   }
      
      // checa se encontrou registro
      // se não encontrou, mostra mensagem
      if ( Leu == 0 )
      {
         printf("\n Registro não encontrado.");         
      }

      // aguarda pressionar uma tecla
      getchar();
      getchar();
      system("cls");

      // fecha o arquiivo
      fclose(estrutura);

  
}

void apagar_livro( char FLivro[TAM] )
{
   FILE *estrutura;
   estrutura = fopen("banco.txt","a");
   char Temporaria[TAM];
   char *Vazio = " ";
   int Deletou = 0;
   long teste;

   while ( (fscanf(estrutura," %s",Temporaria)) != EOF )
   {
      if (!strcmp(Temporaria,FLivro))
      {
         fprintf(estrutura,"%s",Vazio); // apaga nome
         fprintf(estrutura,"%s",Vazio); // apaga genero
         fprintf(estrutura,"%s",Vazio); // apaga autor
         printf("\n Livro apagado com sucesso");
         system("pause>nul");
         Deletou = 1;
      }
      else
      fscanf(estrutura,"\n");
   }
   if ( Deletou == 0 )
   {
      printf("\n Livro \" %s \" não foi deletado",FLivro);
      system("pause>nul");
   }
   
   system("cls");
   fclose(estrutura);
}


int main()
{

   // variaveis do main
   char Nome[TAM],
        Genero[TAM],
        Autor[TAM];
   int Opcao;

   do{
   // menu principal
   printf("\n Cadastro de Livros vers. 1.0");
   printf("\n 1 - Cadastra Livro");
   printf("\n 2 - Pesquisar Livro");
   printf("\n 3 - Apagar registro");
   printf("\n 4 - Sair");
   printf("\n Opcao:  ");
   scanf(" %d",&Opcao);

   switch ( Opcao )
   {
      case 1: // Cadastrar nome
      {
         printf("\n Entre com o nome do livro: ");
         scanf(" %s",Nome);
         printf("\n Entre com o genero do livro: ");
         scanf(" %s",Genero);
         printf("\n Entre com o autor do livro: ");
         scanf(" %s",Autor);
      
         // chama função para cadastrar os livros
         inserir_dados (Nome,Genero,Autor);         
      } break;
      case 2:
      {
         printf("\n Qual o nome do livro que deseja pesquisar? ");
         printf("\n Pesquisar: ");
         scanf(" %s",Nome);
         // chama função pesquisar passando o nome do livro como argumento
         pesquisar_livro(Nome);
      } break;
      case 3:
      {
         printf("\n Digite o nome do livro a ser deletado do arquivo");
         printf("\n Deletar: ");
         scanf(" %s",Nome);
         apagar_livro(Nome);
      } break;
      case 4:
      {
         printf("\n Encerrando o programa...");
         system("pause>nul");
         exit(1);
      } break;      
      default:
      {
         printf("\n Entrou com opcao invalida");
         system("pause>nul");
         system("cls");
      }

   } } while ( (Opcao != 1) || (Opcao != 2) || (Opcao != 3) || (Opcao != 4) );

   return 0;
}

Espero que possam me ajudar.

Agradeço

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

1 resposta a esta questão

Posts Recomendados

  • 0

void apagar_livro( char FLivro[TAM] )

{

FILE *estrutura;

estrutura = fopen("banco.txt","a"); MUDE O a PARA "r"

char Temporaria[TAM];

char *Vazio = " ";

int Deletou = 0;

long teste;

while ( (fscanf(estrutura," %s",Temporaria)) != EOF )

{

if (!strcmp(Temporaria,FLivro))

{

fprintf(estrutura,"%s",Vazio); // apaga nome

fprintf(estrutura,"%s",Vazio); // apaga genero

fprintf(estrutura,"%s",Vazio); // apaga autor

printf("\n Livro apagado com sucesso");

system("pause>nul");

Deletou = 1;

}

else

fscanf(estrutura,"\n");

}

if ( Deletou == 0 )

{

printf("\n Livro \" %s \" não foi deletado",FLivro);

system("pause>nul");

}

system("cls");

fclose(estrutura);

}

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...