Jump to content
Fórum Script Brasil
  • 0

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


Luã Prata
 Share

Question

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 to comment
Share on other sites

3 answers to this question

Recommended Posts

  • 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 to comment
Share on other sites

  • 0

Entendi parte do que disse, mas..

 while (fread (...) != EOF){...

eu iria colocar o que entre os parênteses do fread? Me perdi quanto a isso, desculpe.

Outra lógica que usei porém não deu certo também foi a seguinte:

while(feof(cadastros) == 0)

Edited by Luã Prata
Link to comment
Share on other 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 to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share



  • Forum Statistics

    • Total Topics
      149.9k
    • Total Posts
      646.8k
×
×
  • Create New...