Logo Hardware.com.br
Rafaelvagabond1
Rafaelvagabo... Novo Membro Registrado
22 Mensagens 0 Curtidas

Utilização de Struct e gerar arquivo TXT em C

#1 Por Rafaelvagabo... 13/04/2020 - 18:24
Galera, sou iniciante em programação e estou completamente perdido de como da continuidade nesse exercicio. Este exercicio fala que era para buscar exemplos de como gerar arquivos TXT em C utilizando Struct pois ele não ensina e quer que a gente quebre a cabeça, pois gerar ate esta gerando o problema esta colocar essas informações no codigo utilizando Struct (Malloc, Alloc, Ponteiros e etc...). Fiz este codigo com base em pesquisas porém achei ele um pouco estranho e parece que não igual ao que esta sendo solicitado. Quem puder me ajudar ficaria grato:
[code=c]#include
#include
#define T 1

struct cliente {
char nome [100];
int telefone;
int id;
char tipo [50];
int endereco;
int cep;
};

struct cliente ler () {
struct cliente a;
printf("\n#Cliente\n");
printf("\n----Id:---- \n");
scanf("%d",&a.id);
printf("----Digite seu nome:---- \n");
fflush(stdin);
gets(a.nome);
printf("\n#Telefone\n");
printf("\n----Id:---- \n");
scanf("%d",&a.id);
printf("\n----Telefone:---- \n");
scanf("%d",&a.telefone);
printf("\n----Tipo:---- \n");
fflush(stdin);
gets(a.tipo);
printf("\n#Endereco\n");
printf("\n----Id:---- \n");
scanf("%d",&a.id);
printf("\n----Endereco:---- \n");
scanf("%d",&a.endereco);
printf("\n----CEP:---- \n");
scanf("%d",&a.cep);
printf("\n============================\n");
return a;
}

void imprime (struct cliente a[T]){
int x;
for (x=0; x printf("\t Id: %d\n",a[x].id);
printf("\t Nome: %s\n",a[x].nome);
printf("\t Telefone: %d\n",a[x].telefone);
printf("\t Tipo: %s\n",a[x].tipo);
printf("\t Endereco: %d\n",a[x].endereco);
printf("\t CEP: %d\n",a[x].cep);
}
}

int main () {
int x;
char caminho[]="cliente.txt",caractere;
FILE *arquivo;arquivo = fopen (caminho,"w");
struct cliente a[T];
if (arquivo==NULL) {
printf("Erro ao criar arquivo.\n");
} else {
for(x=0; x a[x]= ler();
fprintf(arquivo,"Id: %d\nNome: %s\nTelefone: %d\nTipo %s\nEndereco: %d\nCEP: %d\n ", a[x].id,a[x].nome,a[x].telefone,a[x].tipo,a[x].endereco,a[x].cep);
printf("\tArquivo gravado com sucesso.\n");
}
fclose(arquivo);
}

imprime(a);
system("pause");
return 0;
}[/code]


Anexo do post Anexo do post

Anexos

esquiloesperto
esquiloesper... Cyber Highlander Moderador
7.1K Mensagens 2.2K Curtidas
#2 Por esquiloesper...
14/04/2020 - 17:03
O código não atende aos requisitos porque são exigidas 4 estruturas de dados:
  • Cliente
  • Telefone
  • Tipo
  • Endereço

É crucial implementar corretamente os relacionamentos entre cada qual, conforme descrito na documentação.

Deveriam ser estruturas individuais mas você resumiu tudo isso como atributos de um único struct. - Neste caso você tiraria zero, ou a nota mínima pelo esforço (se o professor considerar assim).
Só é difícil enquanto estiver oculto! cool.png
Use a pesquisa


rolleyes.png  Navegar é preciso, viver... também.  smile.png
esquiloesperto
esquiloesper... Cyber Highlander Moderador
7.1K Mensagens 2.2K Curtidas
#4 Por esquiloesper...
15/04/2020 - 14:30
Rafaelvagabond1 disse:

Rafael, está claro que você já sabe (ou já entendeu) como funcionam as structs.
- Além do mais, aqui nós ajudamos no seu aprendizado, o que é muito diferente de fazer o trabalho no seu lugar.

Fiz este codigo com base em pesquisas porém achei ele um pouco estranho e parece que não igual ao que esta sendo solicitado.

Foi exatamente isto que pontuei.
Também estamos cientes de que você é novato, aliás por isso mesmo deveria se esforçar em assimilar as ofertas de ajuda ao invés de se arrepiar por qualquer coisa.

Você não disse o que o impediu de continuar, então o que eu disse é uma ajuda sim.

Então faça isso agora: Apresente as suas dificuldades! – Te garanto que assim vai ter respostas e soluções.
Só é difícil enquanto estiver oculto! cool.png
Use a pesquisa


rolleyes.png  Navegar é preciso, viver... também.  smile.png
Rafaelvagabond1
Rafaelvagabo... Novo Membro Registrado
22 Mensagens 0 Curtidas
#5 Por Rafaelvagabo...
16/04/2020 - 10:56
esquiloesperto disse:


Então, eu estava com dificuldade sobre como estruturar cada parametro de cada variavel, pois realmente dessa forma de cima ficou ruim por estruturar tudo em um só.
Com a ajuda de um outro usuário ficou bem melhor dessa forma:

[code=c]#include
#include
#include

typedef unsigned short Numero;

struct e_cli
{
Numero Id;
char Nome[50]; // 100
};
typedef struct e_cli Cliente;

struct e_end
{
Numero IdEndereco;
char Logradouro[50]; // 500
char Cep[8];
};
typedef struct e_end Endereco;

struct e_tel
{
Numero IdTelefone;
char Telefone[20];
};
typedef struct e_tel Telefone;

struct e_tipo
{
Numero IdTipoTelefone;
Numero Tipo;
};
typedef struct e_tipo TipoTelefone;


Cliente f_Cliente(); // cria um cliente
Endereco f_Endereco(); // cria um endereco
Telefone f_Telefone(); // cria um telefone
TipoTelefone f_TipoTelefone(); // cria um tipo

int main(int argc, char** argv)[/code]

O problema esta para gerar o arquivo TXT e estrturar os parametros, pois ele ate me explicou como gerava o arquivo TXT mas esta gerando para cada parametro e eu queria somente um parametro. Isso de gerar o arquivo TXT eu não aprendi ainda, professor mandou a gente meio que se virar e procurar isso.
esquiloesperto
esquiloesper... Cyber Highlander Moderador
7.1K Mensagens 2.2K Curtidas
#6 Por esquiloesper...
16/04/2020 - 22:49
O que você fez e está fazendo é bom, e constitui um famoso paradigma de desenvolvimento que é: "Dividir para conquistar".
Neste caso foi se preocupar primeiro com a parte da estrutura, deixando para depois a lógica de programação: Boa prática!

A parte estrutural parece pronta. Agora, seguindo a documentação, os "relacionamentos" devem ser criados:
[LIST=1]
Cada cliente possui duas listas: {[endereços] e [telefones]} – (opcionais = podem ficar vazias) – mas cada (endereço/telefone) deve possuir um cliente
Cada telefone deve possuir um tipo (tipoTelefone) ← e/ou→ cada tipoTelefone possui uma lista de [telefones] – (obrigatória = não vazia)
[/LIST]

Tente realizar isso e então mostre o que conseguir. Em caso de dúvidas, pergunte.
Só é difícil enquanto estiver oculto! cool.png
Use a pesquisa


rolleyes.png  Navegar é preciso, viver... também.  smile.png
Rafaelvagabond1
Rafaelvagabo... Novo Membro Registrado
22 Mensagens 0 Curtidas
#7 Por Rafaelvagabo...
21/04/2020 - 22:19
esquiloesperto disse:


Com base nos estudos que você me passou, consegui montar o seguinte codigo:

Estou com problemas para imprimir o Logradouro pois aparece um monte de numero aleatorio, mesmo eu inserido uma sequencia de numero. E fiz via teclado pois preciso testar assim.

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

int main () {

struct cliente
{
int idCliente;
char nome[50];
};

struct cliente *x = (struct cliente *) malloc(10 * sizeof(struct cliente));

struct endereco
{
int endereco[100];
int idEndereco;
int cep;
};

struct endereco *y = (struct endereco *) malloc(10 * sizeof(struct endereco));


struct telefone
{
int telefone;
int idTelefone;
char tipo[100];
};

struct telefone *z = (struct telefone *) malloc(10 * sizeof(struct telefone));

int cadastro;

printf("\n -----Quantos clientes deseja cadastrar?-----\n &quot;
scanf("%i", &cadastro);


int count = 1;
for( count = 1 ; count <= cadastro; count++){


printf("\n Digite o nome do Cliente: \n&quot;
scanf("%s", &x[count].nome);


printf("\n Digite o telefone: \n&quot;
scanf("%d", &z[count].telefone);


printf("\n Digite o Tipo de Telefone (Celular/Fixo): \n&quot;
scanf("%s", &z[count].tipo);


printf("\n Digite o Logradouro: \n&quot;
scanf("%s", &y[count].endereco);

printf("\n Digite o CEP: \n&quot;
scanf("%i", &y[count].cep);

}
x[cadastro].idCliente = cadastro;
y[cadastro].idEndereco = cadastro;
z[cadastro].idTelefone = cadastro;

FILE *arquivo;
arquivo = fopen("arquivocliente.txt", "w&quot;
struct cliente;
if (arquivo==NULL){
printf("Erro ao criar arquivo.\n&quot;

}else{


fprintf( arquivo, "###Nome### \n" );
fprintf( arquivo, "Id: %i \n", x[cadastro].idCliente);
fprintf( arquivo, "Nome: %s \n\n", x[cadastro].nome);

fprintf( arquivo, "###Telefone### \n" );
fprintf( arquivo, "Id: %i \n", z[cadastro].idTelefone);
fprintf( arquivo, "Telefone: %d \n", z[cadastro].telefone);
fprintf( arquivo, "Tipo: %s \n\n", z[cadastro].tipo);

fprintf( arquivo, "##Endereço## \n" );
fprintf( arquivo, "Id: %i \n", y[cadastro].idEndereco);
fprintf( arquivo, "Logradouro: %s \n", y[cadastro].endereco);
fprintf( arquivo, "CEP: %i \n\n", y[cadastro].cep);

fclose(arquivo);
return 0;

printf("\tArquivo gravado com sucesso.\n&quot;

fclose(arquivo);

}
getch();
return 0;
}
esquiloesperto
esquiloesper... Cyber Highlander Moderador
7.1K Mensagens 2.2K Curtidas
#8 Por esquiloesper...
23/04/2020 - 00:36
Olha Rafael, vou corrigir o seu código e postar ele corrigido aqui.
Mas preciso antes corrigir você!

Já sabe que não construiu o "TipoTelefone" e continuou usando como se fosse um atributo do telefone! (Que não é!)
Respeite dimensões e tipos de cada atributo conforme a documentação. - Falhar nisto é fracassar no resultado! (Eu já tinha avisado).


Structs representam "domínios" de Banco de Dados => E por isso seguem as mesmas regras:
[LIST=1]
Nomes iniciam em maiúsculas (Camel Case)
Relacionamentos devem ser obrigatoriamente e exatamente construídos
[/LIST]

Lista onde for lista, atributo único onde for atributo único. — Respeite isso, porque:
A menor falha em qualquer destes fatores levam o seu banco (estruturas) ao fracasso! - E junto com ele todo o seu trabalho!!

Deixei comentados os trechos onde deve entrar o "TipoTelefone", observe o código.
O que precisava ficar do código acima foi aproveitado e por isso não use nada dali, a partir de agora faça as suas melhorias neste:
[code=c]#include
#include
#include

int main () {

struct Cliente {
int idCliente;
char nome[101];
};
struct Cliente *x = (struct Cliente *) malloc(10 * sizeof(struct Cliente));

struct Endereco {
char logradouro[501];
int idEndereco;
int cep;
};
struct Endereco *y = (struct Endereco *) malloc(10 * sizeof(struct Endereco));

struct Telefone {
char telefone[21];
int idTelefone;
};
struct Telefone *z = (struct Telefone *) malloc(10 * sizeof(struct Telefone));

char aux[9];

printf("\n -----Quantos clientes deseja cadastrar?-----\n ");
fgets(aux, 4, stdin);
int cadastro = atoi(aux);

int count;
for( count = 1 ; count <= cadastro; count++){

printf("\n Digite o nome do Cliente: ");
fgets(x[count].nome, 50, stdin);

printf(" Digite o telefone: ");
fgets(z[count].telefone, 20, stdin);

//printf("Digite o Tipo de Telefone (1) Celular / (2) Residencial: ");
//fgets(aux, 4, stdin);
//t[count].tipo = atoi(aux);

printf(" Digite o Logradouro: ");
fgets(y[count].logradouro, 500, stdin);

printf(" Digite o CEP: ");
fgets(aux, 8, stdin);
y[count].cep = atoi(aux);

x[count].idCliente = count;
y[count].idEndereco = count;
//t[count].idTipoTelefone = count;
z[count].idTelefone = count;

}

FILE *arquivo;
arquivo = fopen("arquivocliente.txt", "w");

struct cliente;

if (arquivo==NULL){
printf("Erro ao criar arquivo.\n");
}
else{
fprintf( arquivo, "###Nome### \n" );
fprintf( arquivo, "Id: %i \n", x[cadastro].idCliente);
fprintf( arquivo, "Nome: %s \n", x[cadastro].nome);

fprintf( arquivo, "###Telefone### \n" );
fprintf( arquivo, "Id: %i \n", z[cadastro].idTelefone);
fprintf( arquivo, "Telefone: %s \n", z[cadastro].telefone);
//fprintf( arquivo, "Tipo: %s \n\n", z[cadastro].tipo);

fprintf( arquivo, "##Endereço## \n" );
fprintf( arquivo, "Id: %i \n", y[cadastro].idEndereco);
fprintf( arquivo, "Logradouro: %s", y[cadastro].logradouro);
fprintf( arquivo, "CEP: %i \n\n", y[cadastro].cep);

printf("\n\n\tArquivo gravado com sucesso.\n");

fclose(arquivo);

}
//getch();
return 0;
}
[/code]



Resultados:
Anexo do post
Anexo do post

Anexos

Só é difícil enquanto estiver oculto! cool.png
Use a pesquisa


rolleyes.png  Navegar é preciso, viver... também.  smile.png
© 1999-2025 Hardware.com.br. Todos os direitos reservados.
Imagem do Modal