Utilização de Struct e gerar arquivo TXT em C
Alguem ai poderia me ajudar a concluir esse codigo?
Morri na praia aqui, tentei de tudo porem não sei mais para onde ir, fiz isso baseado em pesquisas.
Eu tenho que digitar via TECLADO mas não sei por onde estruturar isso.
"Elaborar um programa utilizando os conceitos de vetores e estruturas mostrados até agora. O programa deverá utilizar estruturas que atendam ao modelo de dados abaixo:
O usuário deverá informar 'n' registros via teclado e o resultado final deverá ser salvo em um arquivo texto conforme modelo abaixo:
#Cliente
Id: 1;
Nome: Cliente 1
##Telefone
Id: 1;
Telefone: 61-99999-9999;
Tipo: Celular;
Id: 2;
Telefone: 61-88888-8888;
Tipo: Residencial;
##Endereco
Id: 1;
Logradouro: Rua dois, 2, Brasilia, DF;
CEP: 70000-000;
#Cliente
Id: 2;
Nome: Cliente 2
##Telefone
Id: 3;
Telefone: 61-99999-9999;
Tipo: Celular;
Id: 4;
Telefone: 61-88888-8888;
Tipo: Residencial;
##Endereco
Id: 2;
Logradouro: Rua dois, 2, Brasilia, DF;
CEP: 70000-000;"
Morri na praia aqui, tentei de tudo porem não sei mais para onde ir, fiz isso baseado em pesquisas.
Eu tenho que digitar via TECLADO mas não sei por onde estruturar isso.
"Elaborar um programa utilizando os conceitos de vetores e estruturas mostrados até agora. O programa deverá utilizar estruturas que atendam ao modelo de dados abaixo:
O usuário deverá informar 'n' registros via teclado e o resultado final deverá ser salvo em um arquivo texto conforme modelo abaixo:
#Cliente
Id: 1;
Nome: Cliente 1
##Telefone
Id: 1;
Telefone: 61-99999-9999;
Tipo: Celular;
Id: 2;
Telefone: 61-88888-8888;
Tipo: Residencial;
##Endereco
Id: 1;
Logradouro: Rua dois, 2, Brasilia, DF;
CEP: 70000-000;
#Cliente
Id: 2;
Nome: Cliente 2
##Telefone
Id: 3;
Telefone: 61-99999-9999;
Tipo: Celular;
Id: 4;
Telefone: 61-88888-8888;
Tipo: Residencial;
##Endereco
Id: 2;
Logradouro: Rua dois, 2, Brasilia, DF;
CEP: 70000-000;"
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> 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) { // quantos vou gerar de cada: int ncli = 5; int nend = 5; int ntel = 5; int ntip = 5; // um lugar para arrumar o registro char preparo[600]; // tem qu caber todo mundo int n = 0; // ncli clientes const char* fcli = "clientes.txt"; FILE* arquivo = fopen(fcli, "w"); for (int i = 1; i <= ncli; i += 1) { Cliente cl = f_Cliente(); // limpa a area // cli: 4 id 100 nome: 104 por linha // mas so 50 no nome por enquanto memset(preparo, ' ', 120); // tudo em branco sprintf(preparo, "%04d", cl.Id); // so Id e Nome memcpy(preparo + 4, cl.Nome, strlen(cl.Nome)); // copia o nome preparo[54] = '\n'; // um por linha pra facilitar int n = fwrite(preparo, 55, 1, arquivo); }; fclose(arquivo); // nend enderecos const char* fend = "enderecos.txt"; arquivo = fopen(fend, "w"); for (int i = 1; i <= nend; i += 1) { Endereco en = f_Endereco(); // limpa a area // endereco: 4 id 500 logradouro 8 CEP: 512 por linha // mas so 50 no logradouro por enquanto memset(preparo, ' ', 520); // tudo em branco sprintf(preparo, "%04d", en.IdEndereco); // so Id e Nome memcpy(preparo + 4, en.Logradouro, strlen(en.Logradouro)); memcpy(preparo + 54, en.Cep, strlen(en.Cep)); preparo[62] = '\n'; // um por linha pra facilitar int n = fwrite(preparo, 63, 1, arquivo); }; fclose(arquivo); // ntel telefones const char* ftel = "telefones.txt"; arquivo = fopen(ftel, "w"); for (int i = 1; i <= ntel; i += 1) { Telefone te = f_Telefone(); // limpa a area // telefone: 4 id 20 Telefone: 24 por linha memset(preparo, ' ', 30); // tudo em branco sprintf(preparo, "%04d", te.IdTelefone); memcpy(preparo + 4, te.Telefone, strlen(te.Telefone)); preparo[24] = '\n'; // um por linha pra facilitar int n = fwrite(preparo, 25, 1, arquivo); }; fclose(arquivo); // ntip tipos const char* ftip = "tipos.txt"; arquivo = fopen(ftip, "w"); for (int i = 1; i <= ntip; i += 1) { TipoTelefone tp = f_TipoTelefone(); // limpa a area // tipo de telefone: 4 id 4 tipo: 8 por linha memset(preparo, ' ', 10); // tudo em branco sprintf(preparo, "%04d%04d", tp.IdTipoTelefone, tp.Tipo); preparo[8] = '\n'; // um por linha pra facilitar int n = fwrite(preparo, 9, 1, arquivo); }; fclose(arquivo); // pra dar uma segurança, vamos ler uns enderecos. E igual // so que ao contrario, logico arquivo = fopen(fend, "r"); Endereco e; int l = 0; // enquanto nao acabar o arquivo le os caras // nao precisa fazer nada // la tem 4 id 50 logradouro 8 cep while( ! feof(arquivo)) { fgets(preparo, 130, arquivo); // le uma linha inteira n = strlen(preparo); printf("Leu %d de 'fend'\n",n); if (feof(arquivo)) break; // deve ter acabado // // IdEndereco que e um numero // l = l + 1; // leu uma linha printf("\n***** %03d\n", l); char id_end[5]; memcpy(id_end, preparo, 4); id_end[4] = 0; // temos o Id no formato certo printf("Id: %s\n", id_end); e.IdEndereco = atoi(id_end); // o simples: converte para int // // Rua com 50 [500 na verdade] // char Rua[51]; // uma string para imprimir Rua[50] = 0; memcpy(e.Logradouro, preparo + 4, 50); memcpy(Rua, preparo + 4, 50); printf("Logradouro: %s\n", Rua); // // CEP com 8 // char CEP[10]; // uma string para imprimir, com '-' CEP[9] = 0; memcpy(e.Cep, preparo + 54, 8); memcpy(CEP, preparo + 54, 5); CEP[5] = '-'; memcpy(CEP+6, preparo + 59, 3); // frescura, claro printf("CEP: %s\n", CEP); }; // while() fclose(arquivo); return 0; }; // main() Cliente f_Cliente() { // // vai criando N clientes com nome ClienteNNNN e Id N // a cada chamada // static int n = 1; Cliente cl; cl.Id = n; sprintf(cl.Nome, "Cliente%04d", n); n = n + 1; return cl; }; // f_Cliente() Endereco f_Endereco() { Endereco e; char cep[9]; static int n = 1; e.IdEndereco = n; sprintf(e.Logradouro, "Rua Via%04d", n); sprintf(cep, "%05d000", n+20000); memcpy(e.Cep, cep, 8); n = n + 1; return e; }; // f_Endereco() Telefone f_Telefone() { Telefone tel; static int n = 1; tel.IdTelefone = n; sprintf(tel.Telefone, "+55 (11) 9%04d%04d", n+3000, n); n = n + 1; return tel; }; // f_Telefone() TipoTelefone f_TipoTelefone() { TipoTelefone tipo; static int n = 1; tipo.IdTipoTelefone = n; tipo.Tipo = n; n = n + 1; return tipo; } // f_TipoTelefone()
Rafael
Curtidas 0