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

Linguagem C : Cadastro de Funcionários [criar lixeira]


Luã Prata

Pergunta

Estou desenvolvendo o meu trabalho final da faculdade , porém só um pequeno detalhe está atrapalhando seu funcionamento perfeito.


Eu cadastrei o funcionário e inseri seus dados etc, depois o exclui, ele vai pra lixeira para que possar ver os excluídos e se o usuário quiser recuperar, porém após apertar que quer recuperar o programa simplesmente trava e tenho que fechar.


Segue abaixo a parte da lixeira, na qual está dando o problema e gostaria de uma ajuda.


obs: Notei que ele roda pela primeira vez o while, e na parte em negrito ele não passa mais da segunda vez.(o EOF fica retornando zero,zero,zero infinitamente, dizendo que é o final do arquivo porém nunca conclui e não sai fora da estrutura de repetição também).



--------------------------------------------------------



void lixeira_cadast(){



struct cadastro aux;


int cont=1,op;



system("cls");


printf("- %do Funcionario Excluido - ",cont);


rewind(cadastros);// coloca o ponteiro no inicio do arquivo para pesquisar desde o começo


while(feof(cadastros) != EOF ){// enquanto não chega no fim do arquivo...


fread(&aux, sizeof(struct cadastro), 1, cadastros);

if (aux.ex == 1){


printf("\n\n- %do Funcionario -",cont);


printf("\nNome: %s",aux.nome);


printf("\nSexo: %d",aux.sexo); //


printf("\nIdade: %d",aux.idade); // e mostro os dados


printf("\nValor do salario: %.2f", aux.salario); //


printf("\nComissao vendida: %.2f", aux.comissao); //


cont++;


printf("\n");


printf("Deseja recuperar o cadastro? (1-Sim,2-Nao): ");


scanf("%d",&op);


if (op==1){ 


aux.ex=0; // altero o campo ex (exclusão logica) para 0


fseek(cadastros, -sizeof(struct cadastro), SEEK_CUR);// ponho o ponteiro no início da ficha


fwrite(&aux, sizeof(struct cadastro), 1, cadastros); // 


printf("Cadastro recuperado com sucesso!");


}


else{ 


getch();




}



}


}

 
Link para o comentário
Compartilhar em outros sites

3 respostass a esta questão

Posts Recomendados

  • 0

Por que você usa feof para condiçao do while? Isso ta errado, falha a lógica. feof é um tipo de flag que somente se ativa quando a ultima leitura falhou.
 Imaginamos que temos que ler varias linhas em um arquivo, funciona assim:

wile ( feof...) //ok.. não tem falho vamos supor que já tínhamos feito leituras anteriores e tudo ok

fread(... // fread lê a penultima linha do arquivo, ao feof continua emitindo true, pois feof somente vai dar falso si a ultima leitura falha.

wile ( feof...) //ok não tem falho a ultima leitura foi bem feita

fread // fread lê a ultima linha se supõe que nesse ponto feof deveria ter emitido falso na seguinte interação, mas não é assim...

wile ( feof...) //ok não emite falso a ultima leitura foi bem sucedida

fread // fread tenta ler uma linha a mais no seu arquivo, ao não poder, pois agora ele atingio o EOF, agora ele passa ao feof a mensagem de que emita um false, mas você já tentou ler algo que possa ter sentado mal ao seu programa.

você deveria usar o próprio valor de retorno de fread, pois ele devolve EOF ou seja -1 justo ao atingir o fim do arquivo. prove ler varias linhas de um arquivo com feof e proceda a ir imprimindo elas, você pode constatar que o programa vai imprimir a ultima linha 2 vezes pois como ele não leu a por que atingiu o EOF imprimirá a ultima repetida. Prove isso e me diga.
while (fread (...) != EOF){...

Link para o comentário
Compartilhar em outros sites

  • 0

Aqui te deixo uma prova da forma correta vs a forma errada de fazer a comprovação do fim do arquivo:

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


int main (){
    //vamos gravar isto no arquivo para fazer provas
    char Lista[10][25] = {
        "Karla","Reyna","Ana"    ,"Gina" ,"Estela",
        "Joan" ,"Mario","Enrique","Maria","Margo"
    };
    int i;
    //size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );
    //size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );
    
    FILE *f = fopen("feof.txt", "w");
    if ( !f ){ perror("Erro: "); getchar(); exit(EXIT_FAILURE); }
    
    i=0;
    while ( i<10 ){ fwrite ( &Lista[i++], 25, 1, f ); }
    fclose(f);
    
    
    //Correto... Agora que temos um arquivo com 10 nomes vamos ler usando 
    //feof e fread para ver o funcionamento de ambos.
    f = fopen("feof.txt", "r");
    char ListaVazia[10][25] = {0};
    i=0;
    printf("Forma correta de ler um arquivo.\n");
    while ( fread( &ListaVazia[i], 25, 1, f ) != 0 ){ printf("%s\n", ListaVazia[i]); i++; } // primero com fwread   
    
    
    memset(ListaVazia, '\0', 25*10); //limpamos a memoria de ListaVazia(tudo a nulos).

    
    printf("\nForma ERRADA de ler um arquivo.\n");
    rewind(f);
    i=0; int flag = 0;
    while (  !feof(f) ){ // Agora vamos usar feof para ver o erro, veremos que ele tenta ler uma vez a mais depois do fim do arquivo 
        fread( ListaVazia[i], 25, 1, f );    
        printf("%s\n", ListaVazia[i] );
        
        //leitura segura nao podemos pasar de aqui
        if( i < 9 ){
            i++;
        }
    }
    fclose(f);
    
    printf("\nRepetiu a ultima? Entao falhou!!XD\n\n");
    getchar();
    return 0;
}

Comprove ela e me diga depois que você acha?

Os livros e os professores nos enganam? Provavelmente XD ;)

Essa é a forma correta de usar feof: http://www.cplusplus.com/reference/cstdio/feof/

Eu deixo aqui a mesma forma modificada para ler o arquivo gerado pelo outro programa anterior para que você faça uma ideia. Tenha certeza que falha a lógica não a função.

/* feof example: byte counter */
#include <stdio.h>

int main () {
    FILE * pFile;
    int n = 0, nLetras = 0;
    pFile = fopen ( "feof.txt", "rb" );
    
    char Ch;
    
    if ( pFile == NULL ) 
        perror ( "Error opening file" );
    else {
        while ( (Ch = fgetc( pFile )) != EOF ) {
            ++n;
            printf("%c", Ch);
            nLetras++;
            if( nLetras==25 ){
                printf("\n");
                nLetras = 0;
            }
        }
        
        if ( feof ( pFile ) ) {
            puts ( "\nEnd-of-File reached." );
            printf ( "Total number of bytes read: %d\n", n );
        } else puts ( "End-of-File was not reached." );
        
        fclose ( pFile );
    }
    
    return 0;
}

Busque por internet como usar feof corretamente, certamente tem muitas paginas que te podem explicar com muito mais detalhes que eu, pois eu sou somente um programador a mais do montão. XDDD

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,3k
×
×
  • Criar Novo...