[AJUDA] CARREGAR ARQUIVO TXT NUMA STRUCT EM LINGUAGEM C

1. [AJUDA] CARREGAR ARQUIVO TXT NUMA STRUCT EM LINGUAGEM C

pedro vitor
pedronardoni

(usa Ubuntu)

Enviado em 29/11/2016 - 01:52h

Olá, pessoal!
Estou com um projeto numa disciplina de programação, onde foi pedido um código que simulasse um sistema de compras online com carrinho e etc.
Eu criei uma struct pra armazenar as informações do produto, como: código, preço, validade.
A duvida é: como eu faço pra carregar um arquivo txt com as informações já digitadas para uma variável do tipo da struct que eu criei???


  


2. Re: [AJUDA] CARREGAR ARQUIVO TXT NUMA STRUCT EM LINGUAGEM C

Enzo de Brito Ferber
EnzoFerber

(usa FreeBSD)

Enviado em 29/11/2016 - 08:28h

Olá, bom dia.

O que você já tentou? Se postar seu código poderemos ajudá-lo de forma eficiente e eficaz. Caso contrário, ou será muito vago ou faremos o código pra você (essa última é sem chance!).

Você pode usar:

fopen() para abrir o arquivo.
fread(), fgets() ou fscanf() para ler do arquivo.
Uma rotina de tratamento de informações, que cria uma estrutura e armazena os dados lidos nos campos corretos.
fclose() para fechar o arquivo.

Enzo Ferber
[]'s


$ indent -kr -i8 src.c

"(...)all right-thinking people know that (a) K&R are _right_ and (b) K&R are right."
- linux/Documentation/CodingStyle - TORVALDS, Linus.



3. Re: [AJUDA] CARREGAR ARQUIVO TXT NUMA STRUCT EM LINGUAGEM C

Uilian Ries
uilianries

(usa Linux Mint)

Enviado em 29/11/2016 - 08:50h

Pode escrever e ler diretamente, a estrutura, utilizando fwrite e fread

Mostre o código que criaste.

--
Uilian Ries
Linux Counter: 521986


4. Re: [AJUDA] CARREGAR ARQUIVO TXT NUMA STRUCT EM LINGUAGEM C

Paulo
paulo1205

(usa Ubuntu)

Enviado em 29/11/2016 - 09:46h

Se o arquivo fosse binário, você poderia copiar todo o conteúdo binário da estrutura (desde que ela não contivesse campos ponteiros). Como não é binário, mas texto, você terá de fazer as operações de leitura de cada campo, individualmente.

O formato do arquivo também é relevante. Será um campo por linha, ou serão campos de largura fixa, ou, ainda, campos separados um do outro por caracteres específicos (CSV, por exemplo)? Haverá linhas de continuação, ou algum outro tipo de sequência de escape?


5. Re: [AJUDA] CARREGAR ARQUIVO TXT NUMA STRUCT EM LINGUAGEM C

pedro vitor
pedronardoni

(usa Ubuntu)

Enviado em 29/11/2016 - 11:44h

Pessoal, o código está muito grande, então postarei só a estrutura (struct) no qual eu quero fazer a leitura das variaveis via arquivo txt:

typedef struct{
int quantidade;
char categoria[10];
int codigo;
float preco;
char descricao[200];
char fornecedor[50];
char validade[10];
int ordem[10];
}produto;

produto produtos[10];


6. Re: [AJUDA] CARREGAR ARQUIVO TXT NUMA STRUCT EM LINGUAGEM C

Enzo de Brito Ferber
EnzoFerber

(usa FreeBSD)

Enviado em 29/11/2016 - 12:03h

Olá,

Primeiro, uma dica: quando for postar códigos aqui no fórum, use as tags [ code] e [/ code] (sem espaços). Fica melhor para ler. No caso do código ser muito extenso, use um serviço como CodePad, PasteBin ou GitHUB.

*

Dada a sua estrutura:


typedef struct{
int quantidade;
char categoria[10];
int codigo;
float preco;
char descricao[200];
char fornecedor[50];
char validade[10];
int ordem[10];
}produto;

produto produtos[10];


Você pode fazer o seguinte:


/* abre o arquivo */
fp = fopen("arquivo", "w");

/* escrita */
fwrite(produtos, sizeof(produto), 10, fp);

/* leitura */
fread(produtos, sizeof(produto), 10, fp);


O primeiro argumento das funções é o ponteiro onde os dados estão/serão armazenados. O segundo argumento é o tamanho de cada item da a ser lido/escrito. O terceiro é o número de elementos. O quarto é o ponteiro para o arquivo, retornado por fopen() ou similares.

Enzo Ferber
[]'s


$ indent -kr -i8 src.c

"(...)all right-thinking people know that (a) K&R are _right_ and (b) K&R are right."
- linux/Documentation/CodingStyle - TORVALDS, Linus.



7. Re: [AJUDA] CARREGAR ARQUIVO TXT NUMA STRUCT EM LINGUAGEM C

pedro vitor
pedronardoni

(usa Ubuntu)

Enviado em 29/11/2016 - 12:34h

Obrigado pela ajuda, mas não sei fazer isso, vou entregar sem essa opção mesmo :(


8. Re: [AJUDA] CARREGAR ARQUIVO TXT NUMA STRUCT EM LINGUAGEM C

pedro vitor
pedronardoni

(usa Ubuntu)

Enviado em 29/11/2016 - 12:37h

Pessoal, mais uma duvida: quando eu coloco pra fazer a leitura dos campos da struct ele só le normalmente as variaveis inteiras, as strings ele não lê, pula pra proxima linha. alguma dica de como posso resolver isso??


9. Re: [AJUDA] CARREGAR ARQUIVO TXT NUMA STRUCT EM LINGUAGEM C

Enzo de Brito Ferber
EnzoFerber

(usa FreeBSD)

Enviado em 29/11/2016 - 12:53h

pedronardoni escreveu:

Obrigado pela ajuda, mas não sei fazer isso, vou entregar sem essa opção mesmo :(


Poste seu código, assim obterá uma ajuda mais eficaz.

Enzo Ferber
[]'s


$ indent -kr -i8 src.c

"(...)all right-thinking people know that (a) K&R are _right_ and (b) K&R are right."
- linux/Documentation/CodingStyle - TORVALDS, Linus.



10. Re: [AJUDA] CARREGAR ARQUIVO TXT NUMA STRUCT EM LINGUAGEM C

Enzo de Brito Ferber
EnzoFerber

(usa FreeBSD)

Enviado em 29/11/2016 - 12:56h

pedronardoni escreveu:

Pessoal, mais uma duvida: quando eu coloco pra fazer a leitura dos campos da struct ele só le normalmente as variaveis inteiras, as strings ele não lê, pula pra proxima linha. alguma dica de como posso resolver isso??

Olá, Pedro.

Novamente, poste seu código e um exemplo do arquivo texto que está tentando ler.
Não podemos ajudá-lo se tivermos que adivinhar o código e o formato do arquivo.

Além do mais, se você tem duas dúvidas diferentes, crie outro tópico. Assim, você facilita a vida de outras pessoas que porventura tenham dúvidas similares.

Enzo Ferber
[]'s


$ indent -kr -i8 src.c

"(...)all right-thinking people know that (a) K&R are _right_ and (b) K&R are right."
- linux/Documentation/CodingStyle - TORVALDS, Linus.



11. Re: [AJUDA] CARREGAR ARQUIVO TXT NUMA STRUCT EM LINGUAGEM C

pedro vitor
pedronardoni

(usa Ubuntu)

Enviado em 29/11/2016 - 12:57h

MAIN:

 #include <string.h>
#include "menu_funcionario.c"
#include "menu_cliente.c"

typedef struct{
int quantidade;
char categoria[10];
int codigo;
float preco;
char descricao[200];
char fornecedor[50];
char validade[10];
int ordem[10];
}produto; //declaração do typedef que vai simular os produtos

typedef struct{
float total;
int quantidade;
int cod[10];
}carrinho;


int main () {

produto produtos[10]; //declaração da variavel produtos que pode armazenar ate 10 produtos diferentes em estoque.
carrinho compras;
int menu;

printf (" BEM VINDO!!! \n");
printf ("*********** DIGITE A OPÇAO DESEJADA: *********** \n");
printf ("[1] - CLIENTE \n[2] - FUNCIONARIO \n");

scanf ("%i", &menu); //leitura da variavel onde o usuario vai escolher se quer entrar no menu do funcionario ou cliente.

while (menu !=1 && menu!=2){
printf ("Numero invalido! Digite uma opçao valida. \n");
scanf ("%i", &menu);
} //laço que vai testar se o usuario digitou uma opção de numero invalida, até ele digitar uma opção válida.

if (menu==1){
menu_cliente(); //chamada da função que trará as opções do menu do cliente.
}

if (menu==2){
menu_funcionario(); //chamada da função que trará as opções do menu do funcionario.
}

return 0;
}


MENU FUNCIONARIO:

 
void menu_funcionario (){

typedef struct{
int quantidade;
char categoria[10];
int codigo;
float preco;
char descricao[200];
char fornecedor[50];
char validade[10];
int ordem[10];
}produto;

typedef struct{
float total;
int quantidade;
int cod[10];
}carrinho;

char add_produto='s', repor='s';
int opcao, cod_repor, quantidade_repor;
int i=1;
produto produtos[10];
carrinho compras;

printf ("Escolha uma das opçoes: \n");
printf ("[1] - Entrada de produtos novos \n");
printf ("[2] - Reposição de estoque \n");
printf ("[3] - Listar produtos e estoque \n");

scanf ("%i", &opcao);

while (opcao!=1 && opcao!=2 && opcao!=3){
printf ("Numero invalido, digite uma opçao valida: \n");
scanf ("%i", &opcao);
}

if (opcao == 1){
while (add_produto=='s'){
for(i=1;i<=20;i++){
printf ("CADASTRAMENTO DE NOVO PRODUTO, PREENCHA OS CAMPOS SEGUINTES: \n");
printf ("Digite a quantidade que deseja adicionar ao estoque: \n");
scanf ("%i", &produtos[i].quantidade);
printf ("Digite a categoria do produto: \n");
scanf ("%[^\n]s", produtos[i].categoria);
printf ("Digite o codigo do produto: \n");
scanf ("%i", &produtos[i].codigo);
printf ("Digite o preço do produto: \n");
scanf ("%f", &produtos[i].preco);
printf ("Digite a descrição do produto: \n");
scanf ("%[^\n]s", produtos[i].descricao);
printf ("Digite o fornecedor do produto: \n");
scanf ("%[^\n]s", produtos[i].categoria);
printf ("Digite a validade do produto: \n");
scanf ("%[^\n]s", produtos[i].validade);
printf ("Deseja adicionar um novo produto? Digite [s] ou [n]: \n");
scanf ("%c", &add_produto);
}
}
}
if (opcao == 2){
while (repor=='s'){
printf ("Digite o codigo do produto que deseja repor: \n");
scanf ("%i", &cod_repor);
for (i=1;i<=10;i++){
if (cod_repor==produtos[i].codigo){
printf("Digite a quantidade que deseja repor em estoque: \n");
scanf ("%i", &quantidade_repor);
produtos[i].quantidade=produtos[i].quantidade + quantidade_repor;
}
}
}
}

if (opcao == 3){
for (i=1;i<=10;i++){
printf ("Quantidade em estoque: %i \n", &produtos[i].quantidade);
printf ("Categoria: %c \n", &produtos[i].categoria);
printf ("Codigo: %i \n", &produtos[i].codigo);
printf ("Preço: %f \n", &produtos[i].preco);
printf ("Descriçao: %c \n", &produtos[i].descricao);
printf ("Categoria: %c \n", &produtos[i].categoria);
printf ("Validade: %c \n", &produtos[i].validade);
}
}
}



MENU CLIENTE:

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

void menu_cliente (){

typedef struct{
int quantidade;
char categoria[10];
int codigo;
float preco;
char descricao[200];
char fornecedor[50];
char validade[10];
int ordem[10];
}produto;

typedef struct{
float total;
int quantidade;
int cod[10];
}carrinho;

produto produtos[10];
char add_carrinho;
int opcao, codigo, carrinhos, total, i=1;
carrinho compras;

printf ("ESCOLHA UMA OPÇAO: \n");
printf ("[1] - Ver lista de produtos \n");
printf ("[2] - Adicionar um produto ao carrinho \n");
printf ("[3] - Remover produto do carrinho \n");
printf ("[4] - Ver produtos no carrinho \n ");
printf ("[5] - Fechar compra \n "); //Opções que aparecem na tela para o usuario escolher.

scanf ("%i", &opcao); //Leitura da opção escolhida pelo usuario.

while (opcao!=1 && opcao!=2 && opcao!=3 && opcao!=4 && opcao!=5){
printf ("Numero invalido, digite uma opcao valida: \n");
scanf ("%i", &opcao);
} //Laço que confere se o usuario digitou uma opção válida.

if (opcao == 1){
for (i=1;i<=20;i++){
printf ("Quantidade em estoque: %i \n", &produtos[i].quantidade);
printf ("Categoria: %c \n", &produtos[i].categoria);
printf ("Codigo: %i \n", &produtos[i].codigo);
printf ("Preço: %f \n", &produtos[i].preco);
printf ("Descriçao: %c \n", &produtos[i].descricao);
printf ("Categoria: %c \n", &produtos[i].categoria);
printf ("Validade: %c \n", &produtos[i].validade);
} //Laço para imprimir na tela todos os produtos cadastrado até o momento.
}

if (opcao == 2){
printf ("Deseja adicionar um novo produto ao carrinho? \n Digite [s] ou [n]: \n");
scanf ("%c", &add_carrinho);
if (add_carrinho =='s'){
while (add_carrinho=='s'){
printf ("Digite o codigo do produto que deseja adicionar ao carrinho: \n");
scanf ("%i", &codigo);
}
} //Laço que adiciona um produto ao carrinho, de acordo com o codigo do produto digitado pelo usuario.
}

if (opcao == 4){
// for (i=1;i<=compras.quantidade[i];i++){
// printf("Codigo: ");
// }
printf ("");
}

if (opcao == 5){
printf ("Compras finalizadas! \n Valor total: %i \n", compras.total);
}
}



12. Re: [AJUDA] CARREGAR ARQUIVO TXT NUMA STRUCT EM LINGUAGEM C

Paulo
paulo1205

(usa Ubuntu)

Enviado em 29/11/2016 - 14:02h

Vamos fazer o “chinês” do seguinte bloco de código (supondo que o usuário não digite nada deliberadamente mal-intencionado para o programa).

l01:	printf ("Digite a quantidade que deseja adicionar ao estoque: \n");
l02: scanf ("%i", &produtos[ i ].quantidade);
l03: printf ("Digite a categoria do produto: \n");
l04: scanf ("%[^\n]s", produtos[ i ].categoria);
l05: printf ("Digite o codigo do produto: \n");
l06: scanf ("%i", &produtos[ i ].codigo);
l07: printf ("Digite o preço do produto: \n");
l08: scanf ("%f", &produtos[ i ].preco);
l09: printf ("Digite a descrição do produto: \n");
l10: scanf ("%[^\n]s", produtos[ i ].descricao);
l11: printf ("Digite o fornecedor do produto: \n");
l12: scanf ("%[^\n]s", produtos[ i ].categoria);
l13: printf ("Digite a validade do produto: \n");
l14: scanf ("%[^\n]s", produtos[ i ].validade);
l15: printf ("Deseja adicionar um novo produto? Digite [s] ou [n]: \n");
l16: scanf ("%c", &add_produto);


Na linha l02, lê o valor de um dado do tipo inteiro. Supondo que o usuário digite um número (por exemplo: 50) e tecle Enter, o conteúdo buffer de entrada nessa hora será "50\n". A conversão "%i" de scanf() consumirá os bytes '5' e '0' e os converterá num valor inteiro que é gravado em produtos[i].quantidade, e deixará o '\n' no buffer de entrada.

O programa então imprime a mensagem da linha l03. A string de formatação da linha l04 pede para ler uma quantidade qualquer (zero ou mais) de caracteres diferentes de '\n', e depois pede para localizar o caráter 's'. Como o buffer de entrada não está vazio e como a conversão "%[" não habilita o descarte de espaços em branco, o processamento do buffer de entrada começa imediatamente, mesmo que o usuário ainda não tenha digitado nada. Como o caráter que está presente no buffer não atende o critério, a conversão "%[\n]" é bem-sucedida, lendo uma string de tamanho zero e deixando o '\n' no buffer de entrada. A seguir, o processamento da string de formatação continua, e o primeiro caráter do buffer é comparado com 's'. Como '\n'!='s', a função mantém o '\n' no buffer de entrada, e interrompe o processamento prematuramente ao notar que parte da string de formatação não corresponde ao conteúdo do buffer.

Ainda com o '\n' da leitura em l02 no buffer de entrada, você passa pela linha l05, imprimindo uma mensagem (que provavelmente o usuário vai ver aparecendo logo após a mensagem da linha l03), e chega à linha l06, que tenta ler um inteiro. A conversão "%i" realiza a supressão de espaços em branco, então o '\n' que sobrara finalmente será consumido. Se o usuário se sentir tentado a digitar o texto da categoria, cuja leitura passou direto por causa do erro na string de formatação de l03, então esse texto será submetido à tentativa de ler um valor inteiro, e provavelmente a leitura vai falhar (a não ser que a categoria seja composta apenas de algarismos), deixando o texto inteiro (incluindo o '\n' correspondente a se se apertado Enter) no buffer. Por outro lado, se o usuário entender que a chance de ler a categoria já passou, e digitar apenas um número inteiro, esse número será lido e convertido, mas o '\n' que vem depois dele vai permanecer no buffer de entrada.

Ao tentar ler o dado de ponto flutuante em l08, se o buffer contiver apenas o '\n', esse '\n' será descartado pelo descarte automático de espaços em branco realizado pela conversão "%f", e o programa vai tentar consumir caracteres que formem num número de ponto flutuante válido e, ao final dessa leitura, o '\n' que segue o número vai ficar no buffer de entrada. Entretanto, se ainda houver texto referente à possível entrada equivocada da leitura em l06, esse texto vai causar também a falha de leitura em l08.

As leituras em l10, l12 e l14 são todas de strings, mas todas têm o mesmo erro na string de formatação que a da leitura em l02 (e uma delas inclusive repete a leitura da categoria). Se se tiver erroneamente digitado o texto da categoria na hora de ler a quantidade, esse texto será finalmente consumido por l10, mas o '\n' que vinha após o texto permanecerá no buffer, deixando de ser consumido também pelas leituras em l12 e l14. Se houver apenas o '\n' após uma leitura bem sucedida em l08, todas as operações em l10, l12 e l14 não conseguirão consumi-lo. Em qualquer dos casos, as três leituras falharão em encontrar o caráter 's' com um retorno de scanf() que ocorrerá antes de chegar ao fim da strong de formatação.

Ao chegar a l16, haverá um '\n' no buffer. Como a conversão "%c" não provoca descarte de espaços em branco, é esse '\n' que será colocado na variável add_produto.



01 02



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts