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

21/04/2020

5

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;"

 
#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

Rafael

Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários,
consulte nossa política de privacidade.

Aceitar