Ir para conteúdo

POWERED BY:

Arquivado

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

Israel Gonçalves

Programa C para ler e edita registros num arquivo

Recommended Posts

Olá pessoas!

Preciso resolver um problema envolvendo arquivo e registro, porém estou tendo dificuldade quanto a arquivos, não tenho noção de como fazer.

 

Ler um arquivo contendo registros no seguinte formato:

ID Descricao PrecoCompra PrecoVenda Qtdade

Onde:

i) ID é um inteiro representando o código do produto

ii) Descricao é uma string simples com o nome do produto

iii) PrecoCompra e PrecoVenda são, respectivamente, preço de compra e de venda dos produtos, em ponto flutuante

iv) Qtdade é um inteiro com a disponibilidade em estoque daquele produto.

 

O arquivo conterá no máximo 100 registros, sendo que a primeira linha contém a informação de quantos registros o arquivo contém.

 

Com base nas informações lidas calcule o lucro obtido em cada produto.

 

Ordene, em ordem crescente, os registros pelo preço de venda, para impressão em tela.

 

Imprima os registros (incluíndo o lucro) de acordo com a ordem estabelecida.

 

>>> Desenvolvi algumas coisas, mas tá bastante incompleto. Agradeço a quem puder ajudar

 

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

void main()
{
   FILE *arq;
   struct lista
   {
          int id;
          char descricao[20];
          int qtdade;
          float preco_compra, preco_venda;
   };    
   lista compra;           
   arq=fopen ("C:\\Users\\Israel\\Desktop\\listadecompra.txt", "w+");

   if( arq == NULL )
   {
       printf("Erro na abertura do arquivo.\n");
   }
   else {
        fread(&compra, sizeof(lista), 20, arq);
        }
        if(ferror(arq))
        {
                       printf("\nErro na leitura");
        }
        else {
             printf("\nLeitura realizada com sucesso.");
             }
             while(!feof(arq))
             {
                              printf ("\nCodido do produto: %d", compra.id);
                              printf ("\nNome do produto: %c", compra.descricao);
                              printf ("\nQuantidade do produto: %d", compra.qtdade);
                              printf ("\nPreco de compra: %2.2f", compra.preco_compra);
                              printf ("nPreco de venda: %2.2f", compra.preco_venda);
                              fread(&compra, sizeof(lista), 20, arq);
                              if(ferror(arq))
                              {
                                             printf("\nErro na leitura");
                                             }
                                             else{
                                                  printf("\nLeitura realizada com sucesso.");
                                                  }
             }
             fclose(arq);
             }

             getch();
             }

Compartilhar este post


Link para o post
Compartilhar em outros sites

Quais as suas dúvidas?

Operação com arquivos você já esta fazendo, só falta a escrita.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Main não retorna void. É sempre int.

Se você vai somente ler o arquivo, o modo é "r" e não "w+" (se o arquivo existir, ele é truncado).

A declaração da variável compra está errada. O correto é uma das formas a seguir:

 

struct lista { ... };
struct lista compra;

 

struct lista { ... } tipo_lista;
tipo_lista compra;

 

P/ imprimir strings o formatador é %s.

 

Fiz um aqui meio rápido.

 

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

struct pedido {
 int codigo;
 char descricao[20];
 int qtde;
 float preco_compra, preco_venda;
};

int main(void) {
 const char * filename = "listadecompra.txt";
 FILE * arq = fopen(filename, "r");

 if (arq == NULL) {
printf("%m\n");
 } else {
struct produto registro;
int scan_val;
do {
 	scan_val = fscanf(arq, "%d %s %d %f %f", &registro.codigo, registro.descricao, &registro.qtde, &registro.preco_compra, &registro.preco_venda);
 	if (scan_val == 0) {
   	puts("Falha na leitura");
 	} else {
   	if (feof(arq) && ferror(arq)) {
     	printf("%m\n");
   	} else if (!feof(arq)) {
     	printf("%d %s %d %.2f %.2f\n", registro.codigo, registro.descricao, registro.qtde, registro.preco_compra, registro.preco_venda);
   	}
 	}
} while (!feof(arq));
fclose(arq);
arq = NULL;
 }
 return 0;
}

 

 

Importante: estou no Linux.

 

P/ saber porque coloquei tanto ferror e feof, veja as páginas de manual das funções na internet e o padrão ISO. Procure por manpage seguido do nome da função. Normalmente elas dizem o que é uma extensão e o que faz parte dos padrões.

 

O formato "%m" é uma extensão implementada pelo GCC. Assim não preciso criar mensagens de erro p/ tudo quanto é caso. Seguindo o C99, use a função strerror() (inclua string.h), passando a variável errno como argumento.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.