Dúvida - CRUD na Linguagem C

26/10/2017

0

C

O problema é Na função "Organizar", que "deleta" os registros com (*). Depois que eu fecho os dois arquivos (produtos.pro e produtosB.pro) e parto para o processo de Remove e Rename...ocorre a seguinte situação:

Após algumas inclusões e exclusões(logicas), na primeira vez que o programa executa a função 6 - Organizar, ele funciona normalmente...mas ai eu continuo adicionar produtos, realizo mais exclusões(logicas)...ai mando organizar novamente, ai dá erro na hora de renomear o arquivo...

Não sei se é problema do código ou do compilador(algum problema de permissão para renomear o arquivo talvez).

Vou colar meu codigo abaixo:

grato pela atenção


// Sintese
// objetivo: Fazer CRUD COMPLETO com arquivo


#include<stdio.h>
#include<stdlib.h>

// Registro / Tipo de Variavel
struct tProduto {
int codigo;
char descricao[10];
float valor;
char deletado; // deletado = '*' / nao deletado = ' ' - exclusao logica
};

//Prototipos
int menu();
void inclusao();
void listar();
void consultar();
void alterar();
void excluir();
void organizar();
void copiar();

//Programa Principal
int main(void) {
int op;

do{
op = menu();
switch (op) {

case 1:
printf("\\n===Incluir===\\n\\n");
inclusao();
break;

case 2:
printf("\\n===Listar===\\n\\n");
listar();
break;

case 3:
printf("\\n===Consultar===\\n\\n");
consultar();
break;

case 4:
printf("\\n===Alterar===\\n\\n");
alterar();
break;

case 5:
printf("\\n===Excluir===\\n\\n");
excluir();
break;

case 6:
printf("\\n===Organizar Arquivo===\\n\\n"); //funciona como uma exclusao fisica
organizar();
break;

case 7:
printf("\\n===Backup===\\n\\n");
copiar();
break;

case 8:
printf("\\n===Restore===\\n\\n");
copiar();
}
}while (op != 0);

// system("pause");
return 0;
}

//Menu de Opcoes
int menu (void){

int opcao;
do {
printf("\\n\\n=== MENU PARA CADASTRO DE PRODUTOS ===\\n\\n");
printf("1. Incluir\\n");
printf("2. Listar\\n");
printf("3. Consultar\\n");
printf("4. Alterar\\n");
printf("5. Excluir\\n");
printf("6. Organizar Arquivo\\n");
printf("7. Backup\\n");
printf("8. Restore\\n");
printf("0. Sair\\n\\n");
printf("Digite sua opcao: ");
scanf("%d", &opcao);
if ((opcao < 0) || (opcao > 8))
printf ("Opcao Digitada Incorreta!\\n");
} while ((opcao < 0) || (opcao > 8));

return opcao;
}

//Funcao Inclusao
void inclusao(){
struct tProduto produtos;

FILE *arq = fopen("produtos.pro", "ab");
if (arq == NULL){
printf("Erro ao abrir arquivo");
return;
}
printf("Digite o codigo do produto: \\n");
scanf("%d", &produtos.codigo);
printf("Digite a descricao do produto: \\n");
fflush(stdin);
gets(produtos.descricao);
printf("Digite o valor do produto: \\n");
scanf("%f", &produtos.valor);
fwrite (&produtos, sizeof(produtos), 1, arq);
fclose(arq);
}

//Funcao Listar
void listar (){

struct tProduto produtos;
FILE *arq = fopen("produtos.pro", "rb");
if (arq == NULL){
printf("Arquivo inexistente!");
return;
}

while (fread (&produtos, sizeof(produtos), 1, arq))
printf("Cod %d --- Descricao: %-8s --- Valor R$ %4.2f --- Deletado?(%c)\\n",produtos.codigo, produtos.descricao, produtos.valor, produtos.deletado);

fclose(arq);
}

//Funcao Consultar
void consultar(){

FILE *arq = fopen("produtos.pro", "rb");
if (arq == NULL){
printf("Arquivo inexistente!");
return;
}

struct tProduto produtos;
int cod, achei = 0;
printf ("\\nDigite o codigo que procura: \\n");
scanf ("%d", &cod);

while (fread (&produtos, sizeof(produtos), 1, arq)){
if ((cod == produtos.codigo) && (produtos.deletado != '*')) {
printf("Cod %d --- Descricao: %-8s --- Valor R$ %4.2f\\n",produtos.codigo, produtos.descricao, produtos.valor);
achei = 1;
}
}

if (!achei)
printf ("\\nCodigo nao cadastrado!!\\n");

fclose(arq);

}

//Funcao Alterar
void alterar(){
FILE *arq = fopen("produtos.pro", "r+b");
if (arq == NULL){
printf("Arquivo inexistente!");
return;
}

struct tProduto produtos;
int cod, achei = 0;
printf ("\\nDigite o codigo que deseja alterar: \\n");
scanf ("%d", &cod);

while (fread (&produtos, sizeof(produtos), 1, arq)){
if (cod == produtos.codigo){
printf("Cod %d --- Descricao: %-8s --- Valor R$ %4.2f\\n\\n",produtos.codigo, produtos.descricao, produtos.valor);
achei = 1;

fseek(arq,sizeof(struct tProduto)*-1, SEEK_CUR);
printf("\\nDigite a nova descricao: \\n");
fflush(stdin);
gets(produtos.descricao);
printf("\\nDigite o novo preco....: \\n");
scanf("%f", &produtos.valor);

fwrite(&produtos, sizeof(produtos), 1, arq);
fseek(arq, sizeof(produtos)* 0, SEEK_END);
return;
}
}

if (!achei)
printf ("\\nCodigo nao cadastrado!!\\n");

fclose(arq);
}

//Exclusao Logica
void excluir(){

FILE *arq = fopen("produtos.pro", "r+b");
if (arq == NULL){
printf("Arquivo inexistente!");
return;
}

struct tProduto produtos;
int cod, achei = 0;
char certeza;
printf ("\\nDigite o codigo que deseja EXCLUIR: \\n");
scanf ("%d", &cod);

while (fread (&produtos, sizeof(produtos), 1, arq)){
if (cod == produtos.codigo){
printf("Cod %d --- Descricao: %-8s --- Valor R$ %4.2f\\n\\n",produtos.codigo, produtos.descricao, produtos.valor);
achei = 1;

printf("\\nTem certeza que quer excluir este produto? s/n \\n");
fflush(stdin);
scanf("%c", &certeza);
if (certeza == 's'){
produtos.deletado = '*';
printf("\\nProduto excluido com Sucesso! \\n");
fseek(arq,sizeof(struct tProduto)*-1, SEEK_CUR);
fwrite(&produtos, sizeof(produtos), 1, arq);
fseek(arq, sizeof(produtos)* 0, SEEK_END);
return;
}
else if (certeza == 'n')
return;
}
}

if (!achei)
printf ("\\nCodigo nao cadastrado!!\\n");

fclose(arq);
}

//Organizar Arquivo
void organizar(){
struct tProduto produtos;
//struct tProduto produtosB; // arquivo de backup

FILE *arq = fopen("produtos.pro", "rb");
if (arq == NULL){
printf("Arquivo inexistente!");
return;
}

FILE *arqB = fopen("BackupProdutos.pro", "wb");
if (arqB == NULL){
printf("Erro na abertura!");
return;
}

while (fread (&produtos, sizeof(produtos), 1, arq)){
if (produtos.deletado != '*'){

fseek(arqB,sizeof(produtos)*-1, SEEK_CUR);
fwrite(&produtos, sizeof(produtos), 1, arqB);
fseek(arqB, sizeof(produtos)* 0, SEEK_END);

}
}

fclose(arq);
fclose(arqB);

remove("produtos.pro");
int teste = 0;
teste = rename("BackupProdutos.pro", "produtos.pro");
if (teste == 0){
printf("\\nArquivo Renomeado com Sucesso! \\n");
printf("\\nArquivo organizado com Sucesso! %d \\n", teste);

}
else printf("\\nErro ao Renomear! %d \\n",teste);
return;

}

//Backup e Restore
void copiar(){
}
Flavio Ferreira

Flavio Ferreira

Responder

Posts

27/10/2017

Flavio Ferreira

não é possivel que ninguém pode ajudar!
Responder

Que tal ter acesso a um e-book gratuito que vai te ajudar muito nesse momento decisivo?

Ver ebook

Recomendado pra quem ainda não iniciou o estudos.

Eu quero
Ver ebook

Recomendado para quem está passando por dificuldades nessa etapa inicial

Eu quero

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar