-
Total de itens
4 -
Registro em
-
Última visita
Posts postados por Flavio_Silva
-
-
Boa noite!
Pessoal, sei que gravação de dados fica melhor com arquivos binários, mais como é pra estudo preciso da seguinte ajuda:
Um exemplo de saída para o programa abaixo:
1;20150410;89;2;V;F
2;20150411;78;1;T;CTodos os dados digitados e gravados são separados por " ; ", ou seja, de forma formatada, agora após a gravação e finalização do programa preciso de uma função que imprima na tela no formato abaixo as informações conforme segue:
CodigoNF =
DT_Emissao =
CodigoCliente =
QtdeItens =
CategoriaNota =
TipoFrete =
Se possível também uma outra função que me diga quantos registros tem no arquivo sendo que cada linha gravada representa 01 registro.
#include <stdio.h> #include <stdlib.h> // um contador global para uso na função principal e booleana int cont = 0; // a struct citada struct st_Nota_Fiscal { int CodigoNF; char DT_Emissao[10]; int CodigoCliente; int QtdeItens; char CategoriaNota[1]; char TipoFrete[1]; }; // criando a função booleana uma vez que estou trabalhando com c enum boolean { true = 1, false = 0 }; typedef enum boolean Grava_dados; //a função de gravação com uso do contador global Grava_Dados (struct st_Nota_Fiscal pv_NotaFiscal[cont]) { FILE *fp; fp = fopen ("NF_010015.txt", "a"); if (fp == NULL) { return (false); exit(1); } else { // usei o fprintf pois melhor se adaptou a gravação com o vetor pv_NotaFiscal. fprintf(fp,"%d;",pv_NotaFiscal[cont].CodigoNF); fprintf(fp,"%s;",pv_NotaFiscal[cont].DT_Emissao); fprintf(fp,"%d;",pv_NotaFiscal[cont].CodigoCliente); fprintf(fp,"%d;",pv_NotaFiscal[cont].QtdeItens); fprintf(fp,"%s;",pv_NotaFiscal[cont].CategoriaNota); fprintf(fp,"%s;\n",pv_NotaFiscal[cont].TipoFrete); fclose (fp); printf ("\n\nDados Gravados com sucesso!\n\n"); } } // função principal usei o setbuf apenas para limpar o buffer do teclado e evitar erro na gravação int main () { char op; do{ struct st_Nota_Fiscal dados[cont]; printf ("Digite o Codigo da NF: "); scanf ("%d", &dados[cont].CodigoNF); setbuf (stdin, NULL); printf ("Digite a data da emissao da NF [DD/MM/AAAA]: "); gets (dados[cont].DT_Emissao); setbuf (stdin, NULL); printf ("Digite o codigo do cliente: "); scanf ("%d", &dados[cont].CodigoCliente); setbuf (stdin, NULL); printf ("Digite a quantidade disponivel: "); setbuf (stdin, NULL); scanf ("%d", &dados[cont].QtdeItens); setbuf (stdin, NULL); printf ("Digite a categoria da NF [V] - Venda ou [T] - Transferencia: "); gets (dados[cont].CategoriaNota); setbuf (stdin, NULL); printf ("Digite o tipo do frete [C] - CIF ou [F] - FOB: "); gets (dados[cont].TipoFrete); setbuf (stdin, NULL); Grava_Dados (dados); cont = cont ++; printf ("\nDeseja gravar mais alguma NF: "); scanf ("%c", &op); } while (op == 'S' || op == 's'); printf ("\nPrograma finalizado com sucesso\n"); return 0; }
-
Boa noite!
Então, devido a minha falta de experiência e mesmo tão bem comentado não consegui entender sua resposta, mais consegui fazer a adaptação necessária conforme segue abaixo:
#include <stdio.h> #include <stdlib.h> // um contador global para uso na função principal e booleana int cont = 0; // a struct citada struct st_Nota_Fiscal { int CodigoNF; char DT_Emissao[10]; int CodigoCliente; int QtdeItens; char CategoriaNota[1]; char TipoFrete[1]; }; // criando a função booleana uma vez que estou trabalhando com c enum boolean { true = 1, false = 0 }; typedef enum boolean Grava_dados; //a função de gravação com uso do contador global Grava_Dados (struct st_Nota_Fiscal pv_NotaFiscal[cont]) { FILE *fp; fp = fopen ("NF_010015.txt", "a"); if (fp == NULL) { return (false); exit(1); } else { // usei o fprintf pois melhor se adaptou a gravação com o vetor pv_NotaFiscal. fprintf(fp,"%d;",pv_NotaFiscal[cont].CodigoNF); fprintf(fp,"%s;",pv_NotaFiscal[cont].DT_Emissao); fprintf(fp,"%d;",pv_NotaFiscal[cont].CodigoCliente); fprintf(fp,"%d;",pv_NotaFiscal[cont].QtdeItens); fprintf(fp,"%s;",pv_NotaFiscal[cont].CategoriaNota); fprintf(fp,"%s;\n",pv_NotaFiscal[cont].TipoFrete); fclose (fp); printf ("\n\nDados Gravados com sucesso!\n\n"); } } // função principal usei o setbuf apenas para limpar o buffer do teclado e evitar erro na gravação int main () { char op; do{ struct st_Nota_Fiscal dados[cont]; printf ("Digite o Codigo da NF: "); scanf ("%d", &dados[cont].CodigoNF); setbuf (stdin, NULL); printf ("Digite a data da emissao da NF [DD/MM/AAAA]: "); gets (dados[cont].DT_Emissao); setbuf (stdin, NULL); printf ("Digite o codigo do cliente: "); scanf ("%d", &dados[cont].CodigoCliente); setbuf (stdin, NULL); printf ("Digite a quantidade disponivel: "); setbuf (stdin, NULL); scanf ("%d", &dados[cont].QtdeItens); setbuf (stdin, NULL); printf ("Digite a categoria da NF [V] - Venda ou [T] - Transferencia: "); gets (dados[cont].CategoriaNota); setbuf (stdin, NULL); printf ("Digite o tipo do frete [C] - CIF ou [F] - FOB: "); gets (dados[cont].TipoFrete); setbuf (stdin, NULL); Grava_Dados (dados); cont = cont ++; printf ("\nDeseja gravar mais alguma NF: "); scanf ("%c", &op); } while (op == 'S' || op == 's'); printf ("\nPrograma finalizado com sucesso\n"); return 0; }
Assim consegui a saída informada.
Agradeço pela atenção, se achar um modo de melhorar pode informar.
-
Boa noite pessoal !
Estou com problemas no código abaixo, pois na minha função Grava_Dados o parâmetro pv_NotaFiscal precisa ser um vetor, dai eu não consigo fazer ele funcionar, alguém poderia me ajudar?
#include <stdio.h>
#include <stdlib.h>
struct st_Nota_Fiscal
{
int CodigoNF;
char DT_Emissao[8];
int CodigoCliente;
int QtdeItens;
char CategoriaNota[1];
char TipoFrete[1];
};
enum boolean
{
true = 1, false = 0
}; typedef enum boolean Grava_dados;
Grava_Dados (struct st_Nota_Fiscal pv_NotaFiscal) // O problema é que pv_NotaFiscal precisa ser um vetor e não uma string
{
FILE *fp;
fp = fopen ("NF_010015.txt", "a");
if (fp == NULL)
{
return (false);
exit(1);
}
else
{
fprintf(fp,"%i;%s;%i;%i;%s;%s;\n",pv_NotaFiscal.CodigoNF, pv_NotaFiscal.DT_Emissao, pv_NotaFiscal.CodigoCliente, pv_NotaFiscal.QtdeItens, pv_NotaFiscal.CategoriaNota, pv_NotaFiscal.TipoFrete);fclose (fp);
return (true);}
}
int main ()
{
char op;
do{
struct st_Nota_Fiscal dados;
printf ("Digite o Codigo da NF: ");
scanf ("%d", &dados.CodigoNF);
setbuf (stdin, NULL);
printf ("Digite a data da emissao da NF: ");
gets (dados.DT_Emissao);
setbuf (stdin, NULL);
printf ("Digite o codigo do cliente: ");
scanf ("%d", &dados.CodigoCliente);
setbuf (stdin, NULL);
printf ("Digite a quantidade disponivel: ");
setbuf (stdin, NULL);
scanf ("%d", &dados.QtdeItens);
setbuf (stdin, NULL);
printf ("Digite a categoria da NF [V] - Venda ou [T] - Transferencia: ");
gets (dados.CategoriaNota);
setbuf (stdin, NULL);
printf ("Digite o tipo do frete [C] - CIF ou [F] - FOB: ");
gets (dados.TipoFrete);
setbuf (stdin, NULL);Grava_Dados (dados);
printf ("Deseja gravar mais alguma NF: ");
scanf ("%c", &op);
} while (op == 'S' || op == 's');
return 0;
}
A saída precisa ser separada com " ; ", conforme exemplo:
1;20150410;89;2;V;F
2;20150411;78;1;T;C
Exercicio impressao em tela
em C, C++
Postado · Editado por Flavio_Silva
<script type='text/javascript'>window.mod_pagespeed_start = Number(new Date());</script>
Boa tarde!
Seu código não tem erro, pode ser sua IDE, aqui esta normal, é obvio que um laço de repetição ficaria melhor mais como voce disse tem que ficar assim.