Ir ao conteúdo

Arquivo em modo binário


inf-paulo

Posts recomendados

Postado

programa esta quase perfeito, só que na hora de abrir o arquivo salvo usando while (!feof(arquivo)) ele sempre imprime uma estrutura a mais....gostaria de saber porque e como fazer pra imprimir apenas o solicitado.

/*
Name: C_estoque
Copyright: FTC
Author: Paulo Jardim
Date: 20/05/11 13:56
Description:
Trabalho 2 Semestre Turma de Sistema de informação FTC 2011
Professor Alex.
Assunto : Controle de Estoque
*/


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

struct estoque
{

char nome[80];
int qtd;
float valor;
struct estoque *ptrprox;

};



typedef struct estoque S_estoque;

S_estoque *ptrprim, *ptrnovo, *ptrultimo;

FILE *arquivo;

int count =0;


void menu();
void cadastro();
void listar();
void salvar();
void abrir();

int main()

{


menu();
system("PAUSE");
return 0;
}

void menu()
{
int op=0;
system("CLS");
printf("Digite a opcao desejada\n\n\n");
printf("1 - Cadastrar novo produto\n");
printf("2 - Listar produtos\n");
printf("3 - Salvar No arquivo\n");
printf("4 - Abrir arquivo\n");

scanf("%d", &op);
switch (op)
{
case 1: cadastro(); break;
case 2: listar(); break;
case 3: salvar(); break;
case 4: abrir(); break;

system("PAUSE");
default : menu();
}
}

void cadastro()
{
int op = 1;

while (op == 1)
{
ptrnovo = (S_estoque *)malloc (sizeof( S_estoque ));
printf("Digite o nome do produto ->");
fflush(stdin);
scanf("%s", ptrnovo->nome);
printf("Digite Quantidade ->");
fflush(stdin);
scanf("%d", &ptrnovo->qtd);
printf("digite o valor ->");
fflush(stdin);
scanf("%f", &ptrnovo->valor);

ptrnovo->ptrprox = NULL; // zerando próima estrutura.

if (ptrprim == NULL) // caso a primeira estrutura esteja zerada ...
ptrprim = ptrnovo; // a atual estrutura passa a ser a primeira
else
ptrultimo->ptrprox = ptrnovo; //prepara a próxima estrutura para ser a atual;

ptrultimo = ptrnovo;

printf("Deseja cadastrar outro produto? 1 para sim e qualquer outra tecla para nao");
scanf("%d", &op);
}
menu();


}

void listar()
{
S_estoque *ptr;

if (ptrprim == NULL)
{
printf("Lista esta vazia\n\n");
system("PAUSE");
menu();
}
ptr = ptrprim; // ptr vai apontar para a primeira estrutura

do{
printf("nome = %s\nidade = %d\nvalor = %f\n\n", ptr->nome, ptr->qtd, ptr->valor);
ptr = ptr->ptrprox; // cada laço ptr aponta para a próxima esturtura
}while (ptr != NULL);

printf("\n\t\tFim da lista");

system("PAUSE");
menu();

}

void salvar()
{
S_estoque *ptr;
ptr = ptrprim;
int i;
count =0;

if ((arquivo = fopen("arquivo.dados","wb")) == NULL )
{

printf("O arquivo nao pode ser aberto.\n\n");
system("PAUSE");
menu();
}


do
{
if (fwrite(ptr, sizeof( S_estoque )-sizeof( int ), 1, arquivo) != 1 )
printf("Erro de leitura de arquivo.\n\n");
ptr = ptr->ptrprox;
count++;
}while (ptr != NULL);

printf("Dados Gravados com sucesso\n\n\n");

fclose(arquivo);

system("PAUSE");
menu();
}

void abrir()
{
S_estoque *ptr;
int i;

if ((arquivo = fopen("arquivo.dados","rb")) == NULL )
{
printf("O arquivo nao pode ser aberto.\n\n");
return;
}


//se usar (while (!feof(arquivo)) ele imprime sempre mais 1 estrutura com lixo de memíria
//for (i=0; i < count; i++)
while (!feof(arquivo))
{
ptr = (S_estoque *)malloc (sizeof( S_estoque )-sizeof( int ));
fread(ptr, (sizeof( S_estoque )-sizeof( int )), 1, arquivo);
{
printf("\nNome : %s", ptr->nome);
printf("\nQuantidade : %d" , ptr->qtd);
printf("\nValor : %.2f", ptr->valor);
printf("\n");
}

}
printf("\n\n\t\tFIM DA LISTA\n\n\n");
system("PAUSE");
fclose(arquivo);
menu();

}


Postado

Fala, cara!

Percebi que o erro que tava acontecendo contigo foi bem parecido com o meu.

Tenta trocar o !feof de dentro do "while" por um fread que leia todo o arquivo pra ver o q acontece, talvez dê certo. Um rewind(arquivo) antes do while também pode ajudar.

Abraço!

Postado

Deu certo :)

Obrigado mesmo pela ajuda...

Eu retirei o

ptr = (S_estoque *)malloc (sizeof( S_estoque )-sizeof( int ));

de dentro do while e coloquei o:

rewind(arquivo);
while (fread(ptr, (sizeof( S_estoque )-sizeof( int )), 1, arquivo))
{


{
printf("\nNome : %s", ptr->nome);
printf("\nQuantidade : %d" , ptr->qtd);
printf("\nValor : %.2f", ptr->valor);
printf("\n");
}

Esta rodando perfeito.

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!