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;
}
Pergunta
d3j4_Vu
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:
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: E o código completo do meu cadastro de livro. É coisa simples q estou fazendo, mas estou com problema na parte de deletar os registrosEspero que possam me ajudar.
Agradeço
Editado por d3j4_VuLink para o comentário
Compartilhar em outros sites
1 resposta a esta questão
Posts Recomendados
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.