Ir para conteúdo

Arquivado

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

mneuer

Exportar pra arquivo .txt

Recommended Posts

Olá pessoal, tudo bem?
Sou novo no fórum e absolutamente iniciante em programação, especificamente em C. Estou cursando uma faculdade e entendendo aos poucos.
Bem, estou aqui pra pedir uma ajuda a vocês.
Meu professor pediu para criarmos um cadastro de clientes, usando um vetor de struct, e na sequência exportar o resultado pra um arquivo de texto (.txt). Eu até consegui criar o código em si (básico do básico do básico) - mas pelo menos fiz sozinho ele hehe. Agora, o exportar pra .txt é que está me emperrando.
É possível acrescentar um comando de exportação no código já pronto ou vou ter que fazer tudo? Eu não estou entendo muito a parte de FILE em C, enfim... alguém poderia me auxiliar?
Este é o código:
PS: Estou aceitando críticas, que sei que existirão. Porém, tomarei como um puro aprendizado!
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <iostream>
using namespace std;

struct cadastro {
	
	char nome[30];
	int idade;
	float peso;
	float altura;
	
};

int main() {

cadastro dados[3];
int i;

for(i=0;i<3;i++) {

printf("Nome da pessoa %d: ", i+1);
scanf(" %49[^\n]", dados[i].nome);
printf("Idade da pessoa %d: ", i+1);
cin >> dados[i].idade;
printf("Peso da pessoa %d: ", i+1);
cin >> dados[i].peso;
printf("Altura da pessoa %d: ", i+1);
cin >> dados[i].altura;
system("cls");
}

for(i=0;i<3;i++) {
	
	printf("===================================\n\n");
	printf("CADASTRO DA PESSOA %d\n\n", i+1);
	printf("===================================\n\n");
	printf("Nome: %s", dados[i].nome);
	printf("\nIdade: %d anos", dados[i].idade);
	printf("\nPeso: %.1f kg", dados[i].peso);
	printf("\nAltura: %.2f cm", dados[i].altura);
	printf("\n\n");

}


	
	getch();
	return 0;
}
Desde já agradeço
Grande abraço

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Primeiro: não misture as linguagens.

 

stdio.h => C

iostream => C++

namespace => C++

printf => C

cout => C++

scanf => C

cin => C++

 

 

Segundo: jogue fora a conio.h

 

"Comando de exportação" -> o que vc entende por isso?

P/ mexer com arquivos em C vc vai ter que trabalhar com ponteiros (http://www.thegeekstuff.com/2012/07/c-file-handling/).

 

 

FILE * fp = fopen("saida.txt", "w+");
if (!fp) {
   perror(strerror(errno)); // inclua os headers  string.h  e  errno.h
   return EXIT_FAILURE; // inclua stdlib.h
}
 
for(i=0; i<3; i++) {
   fprintf(fp, "%s\n%d\n%.2f\n%.2f\n", dados[i].nome, dados[i].idade, dados[i].altura, dados[i].peso);
}
 
fclose(fp);
return EXIT_SUCCES;

Compartilhar este post


Link para o post
Compartilhar em outros sites
Olá Isis, tudo bem?
Primeiramente, sou imensamente grato por sua resposta. Simplesmente funcionou perfeito! =)
Quanto a questão da mistura das linguagens, -1 ponto pra mim, mas para o livro e professor também. No livro e nas aulas é frisado, inúmeras vezes, que em C, podemos escolher entre cin/cout ou printf/scanf, então, imaginei que não haveria problemas em misturá-los. E como gosto de seguir a risca, segui as orientações, errôneas pelo visto, que foram instruídas. Não vou citar o nome da faculdade, tampouco do professor, para não causar problemas!
Bem, voltando ao assunto, o código do trabalho já foi devidamente resolvido com sua magnífica solução! Mais uma vez agradecido.
Porém, como forma de praticar um pouco mais, resolvi pegar o mesmo código e tentar incrementá-lo por conta própria (não há relação com trabalhos dessa vez).
No entanto, me deparei com uma barreira que desconheço a solução. Se você puder me dar um auxílio novamente, prometo que nunca mais a incomodarei, rsrs.
Sendo direto, é possível criar um vetor com valor indefinido? Pois pensei no seguinte: com base no código do trabalho, gostaria de fazer algo que desse ao usuário a opção dele definir o número de clientes que deverão ser cadastrados. Mas eu bato em outro paredão, porque o vetor responsável por isso é proveniente do struct.
Pesquisando no Google, acabei descobrindo as funções malloc e calloc, só que eu não soube uma maneira de encaixá-las em meu "complexo" código ^^
Eis o mesmo atualizado...
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <errno.h>

struct cadastro {

char nome[30];
int idade;
float peso;
float altura;

};

int main() {

cadastro dados[3]; // no lugar de 3 posições colocar um valor indefinido
int i, qtd_clientes=0;

// aqui começa o novo código

do {

printf("Quantos clientes deseja cadastrar? ");
scanf("%d", &qtd_clientes);

if(qtd_clientes == 0) { // msg caso o usuário retorne um valor nulo

printf("\n\nNao ha clientes para cadastrar!\nO programa sera fechado!\n\nObrigado !!!\n\n\n");
return EXIT_SUCCESS;
}

} while (qtd_clientes == 0);

for(i=0;i<3;i++) { // no lugar do 3 inserir o valor de qtd_clientes

printf("Nome da pessoa %d: ", i+1);
scanf(" %49[^\n]", dados.nome);
printf("Idade da pessoa %d: ", i+1);
scanf("%d", &dados.idade);
printf("Peso da pessoa %d: ", i+1);
scanf("%f", &dados.peso);
printf("Altura da pessoa %d: ", i+1);
scanf("%f", &dados.altura);
system("cls");
}

for(i=0;i<3;i++) {

printf("===================================\n\n");
printf("CADASTRO DA PESSOA %d\n\n", i+1);
printf("===================================\n\n");
printf("Nome: %s", dados.nome);
printf("\nIdade: %d anos", dados.idade);
printf("\nPeso: %.1f kg", dados.peso);
printf("\nAltura: %.2f cm", dados.altura);
printf("\n\n");

}

FILE * fp = fopen("saida.txt", "w+");
if (!fp) {
perror(strerror(errno)); // inclua os headers string.h e errno.h
return EXIT_FAILURE; // inclua stdlib.h
}

for(i=0; i<3; i++) {
fprintf(fp, "%s\n%d\n%.2f\n%.2f\n", dados.nome, dados.idade, dados.altura, dados.peso);
}

fclose(fp);
return EXIT_SUCCES;

getch();
return 0;
}
Pelo meu humilde conhecimento, acredito que terei que modificar quase todo código pra adicionar esta função dinâmica. Mas prefiro ouvir a opinião de quem realmente entende do assunto, a sua!
OBS: Eu não removi a conio.h, como você instruiu, pois o programa retornou erro no getch() - dizendo que ele não havia sido declarado no escopo.
Obrigado!

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Perdão... agora que cheguei do serviço e fui remexer no código que percebi que havia esquecido do "" após o "dados".

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

struct cadastro {

char nome[30];
int idade;
float peso;
float altura;

};

int main() {

cadastro dados[3]; // no lugar de 3 posições colocar um valor indefinido
int i, qtd_clientes=0;

// aqui começa o novo código

do {

printf("Quantos clientes deseja cadastrar? ");
scanf("%d", &qtd_clientes);

if(qtd_clientes == 0) { // msg caso o usuário retorne um valor nulo

printf("\n\nNao ha clientes para cadastrar!\nO programa sera fechado!\n\nObrigado !!!\n\n\n");
return EXIT_SUCCESS;
}

} while (qtd_clientes == 0);

for(i=0;i<3;i++) { // no lugar do 3 inserir o valor de qtd_clientes

printf("Nome da pessoa %d: ", i+1);
scanf(" %49[^\n]", dados[i].nome);
printf("Idade da pessoa %d: ", i+1);
scanf("%d", &dados[i].idade);
printf("Peso da pessoa %d: ", i+1);
scanf("%f", &dados[i].peso);
printf("Altura da pessoa %d: ", i+1);
scanf("%f", &dados[i].altura);
system("cls");
}

for(i=0;i<3;i++) {

printf("===================================\n\n");
printf("CADASTRO DA PESSOA %d\n\n", i+1);
printf("===================================\n\n");
printf("Nome: %s", dados[i].nome);
printf("\nIdade: %d anos", dados[i].idade);
printf("\nPeso: %.1f kg", dados[i].peso);
printf("\nAltura: %.2f cm", dados[i].altura);
printf("\n\n");

}

FILE * fp = fopen("saida.txt", "w+");
if (!fp) {
perror(strerror(errno)); // inclua os headers string.h e errno.h
return EXIT_FAILURE; // inclua stdlib.h
}

for(i=0; i<3; i++) {
fprintf(fp, "%s\n%d\n%.2f\n%.2f\n", dados[i].nome, dados[i].idade, dados[i].altura, dados[i].peso);
}

fclose(fp);
return EXIT_SUCCES;

getch();
return 0;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pra exportar em txt é preciso abrir um arquivo e escrever nele (Óbvio).
Vamos lá!

Abrindo arquivo somente para escrita e se o mesmo existir será sobreescrito:

FILE *arq = fopen("dados.txt", "w");

fopen retorna null em caso de falha ao abrir o arquivo (Não existe, falta de permissão...)

if (arq == null) {
fprintf(stderr, "Falha ao abrir o arquivo dados.txt\n");
exit(-1);
}


Escrevendo no arquivo

fprintf escreve no arquivo utilizando formatação (o mesmo que printf).

fprintf(arq, "Nome: %s\r\n", dados.nome);
fprintf(arq, "Idade: %d\r\n", dados.idade);
fprintf(arq, "Peso: %.2f\r\n", dados.peso);
fprintf(arq, "Altura: %.2f\r\n\r\n", dados.altura);


Apos escrever todos os dados é preciso fechar o arquivo:

fclose(arq);

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sendo direto, é possível criar um vetor com valor indefinido? Pois pensei no seguinte: com base no código do trabalho, gostaria de fazer algo que desse ao usuário a opção dele definir o número de clientes que deverão ser cadastrados. Mas eu bato em outro paredão, porque o vetor responsável por isso é proveniente do struct.

 

Sim, é possível criar. Se você estivesse utilizando a linguagem C++, poderia utilizar algumas das bibliotecas da STL (Standad Template Library) Como VECTOR, LIST, DEQUEUE, QUEUE e etc...

Como você está implementando em C pode procurar aprender sobre Lista Dinâmica Encadeada.

link: https://programacaodescomplicada.wordpress.com/tag/lista-dinamica-encadeada/

 

Sempre quando tiver dúvidas sobre alguma função use o site www.cplusplus.com.

 

Mantenha-se firme!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sendo direto, é possível criar um vetor com valor indefinido? Pois pensei no seguinte: com base no código do trabalho, gostaria de fazer algo que desse ao usuário a opção dele definir o número de clientes que deverão ser cadastrados. Mas eu bato em outro paredão, porque o vetor responsável por isso é proveniente do struct.

 

Obs.: Vetor com tamanho indefinido ("vetor com valor indefinido").

 

Dependendo do caso, como é o seu, isso pode ser feito sem filas/listas/pilhas...

É só pedir a quantidade de cadastros que serão realizados e depois definir o vetor de cadastros. Tem duas formas de fazer isso, uma aceita por puristas e outra não.

 

Método não aceito por puristas:

 

int qt = 0;

printf("Quantidade de cadastros: ");

scanf("%d", &qt);

if (qt > 0)

struct cadastro cadastros[qt];

 

Método aceito por puristas:

 

int qt = 0;

struct cadastro *cadastros;

 

printf("Quantidade de cadastros: ");

scanf("%d", &qt);

if (qt > 0)

cadastros = (struct cadastro*) malloc(sizeof(struct cadastro) * qt);

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá pessoal, tudo certinho?

 

Agradeço a todos pela atenção. É muito bom saber que iniciantes, como eu, têm uma assistência profissional como a de vocês aqui. Quem sabe um dia chego no nível de vocês! rsrs

 

TalissonBento

Obrigado pelo incentivo e pelas indicações dos respectivos materiais. Vou dar uma conferida em ambos os links, especialmente no cplusplus. Gosto muito de ler sobre isso. Mas o método que o colega CL4nG instruiu serviu perfeitamente para o meu caso.

 

CL4nG

Muito obrigado! O "método aceito por puristas" resolveu meu problema perfeitamente hehe. Valeu mesmo.

 

Se não for incomodá-los, gostaria de tirar uma última dúvida. Como eu poderia trabalhar com gráficos, ou se possível converter esse meu código para um gráfico, sem ser por aquela janelinha preta do DOS? Digo, invés de imprimir o resultado pelo DOS, imprimi-lo em uma GUI (acho que é esse o nome né?). Andei lendo algumas coisas, e ouvi dizer que o DevC++ é meio fraco pra mexer com isso. Isso procede? Sempre ouço indicações do Code::Blocks. Poderiam me informar se ele é realmente melhor que o Dev, especialmente pra trabalhar com gráficos?

 

Valeu mesmo aos dois colegas

 

Grande abraço e ótimo fim de semana a todos!

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se não for incomodá-los, gostaria de tirar uma última dúvida. Como eu poderia trabalhar com gráficos, ou se possível converter esse meu código para um gráfico, sem ser por aquela janelinha preta do DOS? Digo, invés de imprimir o resultado pelo DOS, imprimi-lo em uma GUI (acho que é esse o nome né?). Andei lendo algumas coisas, e ouvi dizer que o DevC++ é meio fraco pra mexer com isso. Isso procede? Sempre ouço indicações do Code::Blocks. Poderiam me informar se ele é realmente melhor que o Dev, especialmente pra trabalhar com gráficos?

 

Procure saber sobre QT, GTK, wxWidgets...

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

 

OBS: Eu não removi a conio.h, como você instruiu, pois o programa retornou erro no getch() - dizendo que ele não havia sido declarado no escopo.

 

Isso acontece porque o getch está definido na conio.h. Remova isso do seu código. Leia aqui: http://en.wikipedia.org/wiki/Conio.h

Compartilhar este post


Link para o post
Compartilhar em outros sites

CL4nG

Obrigado pelas dicas. Vou dar uma pesquisada sobre esses itens que você sugeriu.

 

Isis

Agora sim eu entendi. Desculpe minha ignorância! O começo é algo complicado, especialmente quando se trata de programação :upset:

 

Bem, agradeço a todos pela grande ajuda. Aprendi muito só com este tópico aqui.

 

Se quiserem fechar o tópico, sintam-se a vontade. Por enquanto, é só isso. Valeu mesmo Isis, CL4nG e Talisson =)

 

Abração e ótima semana a todos!

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.