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