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

(Resolvido) Arquivos


AlineI

Pergunta

Bom, este programa consiste em Cadastrar e Buscar no arquivo de registro, usando fread e fwrite, mas, na execução do programa, ao achar o livro atraves do autor, ele imprimi as caracteristicas do livro duas vezes, mas lá no arquivo que foi criado, ele imprimi só uma vez, como deve ser.

Ou seja, quando é só um arquivo, ele le de novo, mas já fiz teste com dois, e isso não acontece. Qual poderia ser o problema? Na condição de parada?

obs: ignorem alguns comentários que eram válidos quando era apenas um teste.

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

typedef struct
{
    char titulo[20];
    char autor[20];
    char assunto[20];
    char editora[20];
    int edicao;
}reg;
typedef reg registro;

registro regLivro;

void Cadastro()
{
    //funcao que grava os dois regs acima no arquivo.
    FILE *ptrArq;
    ptrArq = fopen("Teste.txt","wb");//escrita binaria

    printf("Titulo: ");
    gets(regLivro.titulo);
    printf("Autor: ");
    gets(regLivro.autor);
    printf("Assunto: ");
    gets(regLivro.assunto);
    printf("Editora: ");
    gets(regLivro.editora);
    printf("Edicao: ");
    scanf("%d", ®Livro.edicao);
    fflush(stdin);

    fwrite(®Livro,sizeof(registro),1,ptrArq);//salva o arquivo 1,
    //fwrite(&teste2,sizeof(registro),2,arq);//o parametro mudou para 2,
                                           //para não sobrescrever o
                                           //registro 1
    fclose(ptrArq);//fecha o arquivo para não ferra-lo.
    //Somente salva o arquivo no disco.
}

void Busca(char *autor)//passa como parametro uma chave pela qual busca...
{
    FILE *ptrArq;//arquivo...
    ptrArq = fopen("Teste.txt","rb");//leitura binaria, usada para ler registros.
    registro temp;//registro temporario
    //int posicao =1;//so para mostrar onde achou o reg no arquivo...
    while(!feof(ptrArq))//enquanto não FimDeArquivo(NomeDoArquivo)
    {
        fread(&temp,sizeof(registro),1,ptrArq);//Le um registro salvando o no temp...

        //no caso esta comparando o paramentro com o campo TESTE do registro
        /*
        *Poderiamos buscar em um registro por exemplo pelo campo RGA, então essa busca seria util...
        */
        if (strcmp(temp.autor,autor)==0)//e compara se a chave do registro lido é igual a procurada.
        {
            //printf("Achou a parada na posicao %d\n",posicao);//se encontrou mostra-a.
            printf("\nTitulo: %s", temp.titulo);
            printf("\nAutor: %s", temp.autor);
            printf("\nAssunto: %s", temp.assunto);
            printf("\nEditora: %s", temp.editora);
            printf("\nEdicao: %d", temp.edicao);
        }
        else printf("Livro inexistente no arquivo");
        //posicao++;//avanca o contador.
    }
    fclose(ptrArq);//fecha

}
int main()
{
    char autor[20];

    Cadastro();

    printf("Informe o autor para efetuar a busca: ");
    gets(autor);

    Busca(autor);

    return 0;
}

Editado por AlineI
Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 0

Faça assim no while:

while(fread(&temp,sizeof(registro),1,ptrArq))

E, claro, retire o fread() de dentro do bloco do while

Isso funciona pois fread() retorna o número de ítens lidos.

Eu tive o mesmo problema com feof(), mas não descobri o motivo.

Se eu descobrir, posto aqui

Editado por Beraldo
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...