Ir ao conteúdo
  • Cadastre-se
marechalmelo

C Salvar struct em arquivo binario e depois mandar o binario para a struct

Posts recomendados

Estou com um algoritmo que:

Ele esta salvando os dados recebidos de uma struct em um arquivo binario, ate ai tudo bem.

So que necessito que: quando eu iniciar de novo esse algoritmo os dados que estão salvos no arquivo, exemplo:

nome

endereco

idade,

voltem para a struct na posicao que esta salvo no arquivo exemplo:

no arquivo foi salvo:

nome: Joao

endereco: centro

idade,: 18

 

nome: rafael

endereco: beco

idade,: 20

quando eu iniciar novamente o software necessito que tenha uma funcao que ja faz automaticamente o envio do arquivo para a struct nas devidas posições:

struct cadastro:

posicao 0

nome: Joao

endereco: centro

idade,: 18

posicao 1

nome: rafael

endereco: beco

idade,: 20

 

alguem poderia me ajudar?

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Poste o que você já fez

Compartilhar este post


Link para o post
Compartilhar em outros sites

@KXSY Ja tenho o algoritmo pronto funcionando porém sem a introduçao de arquivos.

Meu algoritmo nessa parte esta assim, nao sei como implementar corretamente arquivos.

funcao do cadastro

void CadastroHotel(criar_Hotel *cadastro_hotel, int *contador) {
    criar_Hotel cadastro_hotel_dadosx;
    FILE* arquivo_hotel;
    arquivo_hotel = fopen("hotel.txt", "ab");
    if (arquivo_hotel == NULL) {
        printf("Problemas na abertura do arquivo");
    } else {
        printf("Digite o nome Fantasia\n");
        setbuf(stdin, NULL);
        fgets(cadastro_hotel_dadosx.nome_social, 100, stdin);
        printf(" Digite a Razao Social \n ");
        setbuf(stdin, NULL);
        fgets(cadastro_hotel_dadosx.razao_social, 100, stdin);
        printf(" Inscricao Estadual \n ");
        setbuf(stdin, NULL);
        fgets(cadastro_hotel_dadosx.inscricao_estadual, 100, stdin);
        printf(" Digite o Endereco \n ");
        setbuf(stdin, NULL);
        fgets(cadastro_hotel_dadosx.endereco, 100, stdin);
        printf(" Digite o E-mail \n ");
        setbuf(stdin, NULL);
        fgets(cadastro_hotel_dadosx.email, 100, stdin);
        printf(" Digite o nome do dono \n ");
        setbuf(stdin, NULL);
        fgets(cadastro_hotel_dadosx.nome_dono, 100, stdin);
        printf(" Digite o CNPJ \n ");
        scanf("%f", &cadastro_hotel_dadosx.cnpj);
        printf(" Digite o Telefone do dono \n ");
        scanf("%f", &cadastro_hotel_dadosx.telefone_dono);
        printf(" Digite o Telefone do Hotel \n ");
        scanf("%f", &cadastro_hotel_dadosx.telefone);
        printf(" Horario Check-in \n ");
        scanf("%f", &cadastro_hotel_dadosx.horario_chegar);
        printf(" Horario Check-out \n ");
        scanf("%f", &cadastro_hotel_dadosx.horario_sair);
        printf(" Lucro Produtos Vendidos \n ");
        scanf("%f", &cadastro_hotel_dadosx.lucro_produtos_vendidos);
        fwrite(&cadastro_hotel_dadosx, sizeof (criar_Hotel), 1, arquivo_hotel);
        system("cls");

        printf(" --------------------------------------- \n");
        printf(" Hotel Cadastrado Com Sucesso \n");
        printf(" --------------------------------------- \n\n");
    }
    fclose(arquivo_hotel);
    (*(cadastro_hotel + (*contador))).cnpj = cadastro_hotel_dadosx.cnpj;
    (*(cadastro_hotel + (*contador))).horario_chegar = cadastro_hotel_dadosx.horario_chegar;
    (*(cadastro_hotel + (*contador))).horario_sair = cadastro_hotel_dadosx.horario_sair;
    (*(cadastro_hotel + (*contador))).lucro_produtos_vendidos = cadastro_hotel_dadosx.lucro_produtos_vendidos;
    (*(cadastro_hotel + (*contador))).telefone_dono = cadastro_hotel_dadosx.telefone_dono;
    (*(cadastro_hotel + (*contador))).telefone = cadastro_hotel_dadosx.telefone;
    strcpy((*(cadastro_hotel + (*contador))).nome_social, cadastro_hotel_dadosx.nome_social);
    strcpy((*(cadastro_hotel + (*contador))).razao_social, cadastro_hotel_dadosx.razao_social);
    strcpy((*(cadastro_hotel + (*contador))).inscricao_estadual, cadastro_hotel_dadosx.inscricao_estadual);
    strcpy((*(cadastro_hotel + (*contador))).endereco, cadastro_hotel_dadosx.endereco);
    strcpy((*(cadastro_hotel + (*contador))).nome_dono, cadastro_hotel_dadosx.nome_dono);
    strcpy((*(cadastro_hotel + (*contador))).email, cadastro_hotel_dadosx.email);
    (*contador)++;

}



fim da funcao do cadastro

int main(){

 hotel_Home = 0;
                        while (hotel_Home != 5) {

                            printf(" 1 - Cadastrar Hotel \n");
                            printf(" 2 - Ver Hotel \n");
                            printf(" 3 - Editar Hotel \n");
                            printf(" 4 - Excluir Hotel \n");
                            printf(" 5 - Sair \n");
                            scanf("%d", &hotel_Home);
                            //Switch do Menu
                            switch (hotel_Home) {
                                    // Caso 1 para cadastrar Produtos
                                case 1:
                                    CadastroHotel(cadastro_hotel, &contador_hotel);
                                    cadastro_hotel = realloc(cadastro_hotel, (contador_hotel + 2) * sizeof (criar_Hotel));












                                    break; // Fecha o case do switch principal



}

fim main

 

Eu gostaria que toda vez que iniciasse o programa o arquivo carregase e mandasse novamente para a struct tipo algo assim: sei que esta errado mas e nesse raciocinio

 

 

 

void passar(criar_Hotel *cadastro_hotel, int *contador) {
    criar_Hotel cadastro_hotel_dadosx;
    FILE* arquivo_hotel;
    arquivo_hotel = fopen("hotel.txt", "rb");
    if (arquivo_hotel == NULL) {
        printf("Problemas na abertura do arquivo");

    } else {
        while (fread(&cadastro_hotel_dadosx, sizeof (criar_Hotel), 1, arquivo_hotel) == 1) {
            fscanf(arquivo_hotel, "%f", (cadastro_hotel + contador));
            (*(cadastro_hotel + (contador))).cnpj = cadastro_hotel_dadosx.cnpj;
            (*(cadastro_hotel + (contador))).horario_chegar = cadastro_hotel_dadosx.horario_chegar;
            (*(cadastro_hotel + (contador))).horario_sair = cadastro_hotel_dadosx.horario_sair;
            (*(cadastro_hotel + (contador))).lucro_produtos_vendidos = cadastro_hotel_dadosx.lucro_produtos_vendidos;
            (*(cadastro_hotel + (contador))).telefone_dono = cadastro_hotel_dadosx.telefone_dono;
            (*(cadastro_hotel + (contador))).telefone = cadastro_hotel_dadosx.telefone;
            strcpy((*(cadastro_hotel + (contador))).nome_social, cadastro_hotel_dadosx.nome_social);
            strcpy((*(cadastro_hotel + (contador))).razao_social, cadastro_hotel_dadosx.razao_social);
            strcpy((*(cadastro_hotel + (contador))).inscricao_estadual, cadastro_hotel_dadosx.inscricao_estadual);
            strcpy((*(cadastro_hotel + (contador))).endereco, cadastro_hotel_dadosx.endereco);
            strcpy((*(cadastro_hotel + (contador))).nome_dono, cadastro_hotel_dadosx.nome_dono);
            strcpy((*(cadastro_hotel + (contador))).email, cadastro_hotel_dadosx.email);
            (*contador)++;
        }
        printf(" Todos os dados foram passados");


    }
    fclose(arquivo_hotel);


}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Daria para postar todo o código?

Compartilhar este post


Link para o post
Compartilhar em outros sites

@KXSY

typedef struct criar_Hotel {
    // declara todas as variaveis do cadastro dos dados do hotel //
    char nome_social[100];
    char razao_social[100];
    char inscricao_estadual[100];
    float cnpj;
    char endereco[100];
    float telefone;
    char email[100];
    char nome_dono[100];
    float telefone_dono;
    float horario_chegar;
    float horario_sair;
    float lucro_produtos_vendidos;
    //
} criar_Hotel;
void CadastroHotel(criar_Hotel *cadastro_hotel, int *contador) {
    criar_Hotel cadastro_hotel_dadosx;
    FILE* arquivo_hotel;
    arquivo_hotel = fopen("hotel.txt", "ab");
    if (arquivo_hotel == NULL) {
        printf("Problemas na abertura do arquivo");
    } else {
        printf("Digite o nome Fantasia\n");
        setbuf(stdin, NULL);
        fgets(cadastro_hotel_dadosx.nome_social, 100, stdin);
        printf(" Digite a Razao Social \n ");
        setbuf(stdin, NULL);
        fgets(cadastro_hotel_dadosx.razao_social, 100, stdin);
        printf(" Inscricao Estadual \n ");
        setbuf(stdin, NULL);
        fgets(cadastro_hotel_dadosx.inscricao_estadual, 100, stdin);
        printf(" Digite o Endereco \n ");
        setbuf(stdin, NULL);
        fgets(cadastro_hotel_dadosx.endereco, 100, stdin);
        printf(" Digite o E-mail \n ");
        setbuf(stdin, NULL);
        fgets(cadastro_hotel_dadosx.email, 100, stdin);
        printf(" Digite o nome do dono \n ");
        setbuf(stdin, NULL);
        fgets(cadastro_hotel_dadosx.nome_dono, 100, stdin);
        printf(" Digite o CNPJ \n ");
        scanf("%f", &cadastro_hotel_dadosx.cnpj);
        printf(" Digite o Telefone do dono \n ");
        scanf("%f", &cadastro_hotel_dadosx.telefone_dono);
        printf(" Digite o Telefone do Hotel \n ");
        scanf("%f", &cadastro_hotel_dadosx.telefone);
        printf(" Horario Check-in \n ");
        scanf("%f", &cadastro_hotel_dadosx.horario_chegar);
        printf(" Horario Check-out \n ");
        scanf("%f", &cadastro_hotel_dadosx.horario_sair);
        printf(" Lucro Produtos Vendidos \n ");
        scanf("%f", &cadastro_hotel_dadosx.lucro_produtos_vendidos);
        fwrite(&cadastro_hotel_dadosx, sizeof (criar_Hotel), 1, arquivo_hotel);
        system("cls");

        printf(" --------------------------------------- \n");
        printf(" Hotel Cadastrado Com Sucesso \n");
        printf(" --------------------------------------- \n\n");
    }
    fclose(arquivo_hotel);
    (*(cadastro_hotel + (*contador))).cnpj = cadastro_hotel_dadosx.cnpj;
    (*(cadastro_hotel + (*contador))).horario_chegar = cadastro_hotel_dadosx.horario_chegar;
    (*(cadastro_hotel + (*contador))).horario_sair = cadastro_hotel_dadosx.horario_sair;
    (*(cadastro_hotel + (*contador))).lucro_produtos_vendidos = cadastro_hotel_dadosx.lucro_produtos_vendidos;
    (*(cadastro_hotel + (*contador))).telefone_dono = cadastro_hotel_dadosx.telefone_dono;
    (*(cadastro_hotel + (*contador))).telefone = cadastro_hotel_dadosx.telefone;
    strcpy((*(cadastro_hotel + (*contador))).nome_social, cadastro_hotel_dadosx.nome_social);
    strcpy((*(cadastro_hotel + (*contador))).razao_social, cadastro_hotel_dadosx.razao_social);
    strcpy((*(cadastro_hotel + (*contador))).inscricao_estadual, cadastro_hotel_dadosx.inscricao_estadual);
    strcpy((*(cadastro_hotel + (*contador))).endereco, cadastro_hotel_dadosx.endereco);
    strcpy((*(cadastro_hotel + (*contador))).nome_dono, cadastro_hotel_dadosx.nome_dono);
    strcpy((*(cadastro_hotel + (*contador))).email, cadastro_hotel_dadosx.email);
    (*contador)++;

}
// Verifica os hoteis

void atualizaHotel() {
    criar_Hotel cadastro_hotel_dadosx;
    int posicao = 0;
    FILE* arquivo_hotel;
    arquivo_hotel = fopen("hotel.txt", "w");
    fseek(arquivo_hotel, posicao, SEEK_SET);

    if (arquivo_hotel == NULL) {
        printf("Problemas na abertura do arquivo");

    } else {
        printf("Digite o nome Fantasia\n");
        setbuf(stdin, NULL);
        fgets(cadastro_hotel_dadosx.nome_social, 100, stdin);
        printf(" Digite a Razao Social \n ");
        setbuf(stdin, NULL);
        fgets(cadastro_hotel_dadosx.razao_social, 100, stdin);
        printf(" Inscricao Estadual \n ");
        setbuf(stdin, NULL);
        fgets(cadastro_hotel_dadosx.inscricao_estadual, 100, stdin);
        printf(" Digite o Endereco \n ");
        setbuf(stdin, NULL);
        fgets(cadastro_hotel_dadosx.endereco, 100, stdin);
        printf(" Digite o E-mail \n ");
        setbuf(stdin, NULL);
        fgets(cadastro_hotel_dadosx.email, 100, stdin);
        printf(" Digite o nome do dono \n ");
        setbuf(stdin, NULL);
        fgets(cadastro_hotel_dadosx.nome_dono, 100, stdin);
        printf(" Digite o CNPJ \n ");
        scanf("%f", &cadastro_hotel_dadosx.cnpj);
        printf(" Digite o Telefone do dono \n ");
        scanf("%f", &cadastro_hotel_dadosx.telefone_dono);
        printf(" Digite o Telefone do Hotel \n ");
        scanf("%f", &cadastro_hotel_dadosx.telefone);
        printf(" Horario Check-in \n ");
        scanf("%f", &cadastro_hotel_dadosx.horario_chegar);
        printf(" Horario Check-out \n ");
        scanf("%f", &cadastro_hotel_dadosx.horario_sair);
        printf(" Lucro Produtos Vendidos \n ");
        scanf("%f", &cadastro_hotel_dadosx.lucro_produtos_vendidos);
        fseek(arquivo_hotel, posicao, SEEK_SET);
        fwrite(&cadastro_hotel_dadosx, sizeof (criar_Hotel), 1, arquivo_hotel);
        system("cls");
        printf(" --------------------------------------- \n");
        printf(" Hotel Atualizado Com Sucesso \n");
        printf(" --------------------------------------- \n\n");
    }
    fclose(arquivo_hotel);





}
// Mostra os hoteis

void verHotel(criar_Hotel *cadastro_hotel, int contador) {
    int i;
    for (i = 0; i < contador; i++) {
        printf("Nome Social:  %s ", (cadastro_hotel + i)->nome_social);
        printf("Razao Social: %s ", (cadastro_hotel + i)->razao_social);
        printf("Inscricao Estadual: %s ", (cadastro_hotel + i)->inscricao_estadual);
        printf("CNPJ: %f \n", (cadastro_hotel + i)->cnpj);
        printf("Endereco: %s ", (cadastro_hotel + i)->endereco);
        printf("Nome dono: %s ", (cadastro_hotel + i)->nome_dono);
        printf("Telefone Dono: %f \n", (cadastro_hotel + i)->telefone_dono);
        printf("E-mail: %s ", (cadastro_hotel + i)->email);
        printf("Horario Check-in: %f \n", (cadastro_hotel + i)->horario_chegar);
        printf("Horario Check-out: %f \n", (cadastro_hotel + i)->horario_sair);
        printf("Lucro Produtos Vendidos: %f \n", (cadastro_hotel + i)->lucro_produtos_vendidos);
        printf("Endereco: %s \n", (cadastro_hotel + i)->endereco);
    }
}

void passar(criar_Hotel *cadastro_hotel, int *contador) {
    criar_Hotel cadastro_hotel_dadosx;
    FILE* arquivo_hotel;
    arquivo_hotel = fopen("hotel.txt", "rb");
    if (arquivo_hotel == NULL) {
        printf("Problemas na abertura do arquivo");

    } else {
        while (fread(&cadastro_hotel_dadosx, sizeof (criar_Hotel), 1, arquivo_hotel) == 1) {
            fscanf(arquivo_hotel, "%f", (cadastro_hotel + contador));
            (*(cadastro_hotel + (contador))).cnpj = cadastro_hotel_dadosx.cnpj;
            (*(cadastro_hotel + (contador))).horario_chegar = cadastro_hotel_dadosx.horario_chegar;
            (*(cadastro_hotel + (contador))).horario_sair = cadastro_hotel_dadosx.horario_sair;
            (*(cadastro_hotel + (contador))).lucro_produtos_vendidos = cadastro_hotel_dadosx.lucro_produtos_vendidos;
            (*(cadastro_hotel + (contador))).telefone_dono = cadastro_hotel_dadosx.telefone_dono;
            (*(cadastro_hotel + (contador))).telefone = cadastro_hotel_dadosx.telefone;
            strcpy((*(cadastro_hotel + (contador))).nome_social, cadastro_hotel_dadosx.nome_social);
            strcpy((*(cadastro_hotel + (contador))).razao_social, cadastro_hotel_dadosx.razao_social);
            strcpy((*(cadastro_hotel + (contador))).inscricao_estadual, cadastro_hotel_dadosx.inscricao_estadual);
            strcpy((*(cadastro_hotel + (contador))).endereco, cadastro_hotel_dadosx.endereco);
            strcpy((*(cadastro_hotel + (contador))).nome_dono, cadastro_hotel_dadosx.nome_dono);
            strcpy((*(cadastro_hotel + (contador))).email, cadastro_hotel_dadosx.email);
            (*contador)++;
        }
        printf(" Todos os dados foram passados");
        

    }
    fclose(arquivo_hotel);
    (*(cadastro_hotel + (*contador))).cnpj = cadastro_hotel_dadosx.cnpj;
    (*(cadastro_hotel + (*contador))).horario_chegar = cadastro_hotel_dadosx.horario_chegar;
    (*(cadastro_hotel + (*contador))).horario_sair = cadastro_hotel_dadosx.horario_sair;
    (*(cadastro_hotel + (*contador))).lucro_produtos_vendidos = cadastro_hotel_dadosx.lucro_produtos_vendidos;
    (*(cadastro_hotel + (*contador))).telefone_dono = cadastro_hotel_dadosx.telefone_dono;
    (*(cadastro_hotel + (*contador))).telefone = cadastro_hotel_dadosx.telefone;
    strcpy((*(cadastro_hotel + (*contador))).nome_social, cadastro_hotel_dadosx.nome_social);
    strcpy((*(cadastro_hotel + (*contador))).razao_social, cadastro_hotel_dadosx.razao_social);
    strcpy((*(cadastro_hotel + (*contador))).inscricao_estadual, cadastro_hotel_dadosx.inscricao_estadual);
    strcpy((*(cadastro_hotel + (*contador))).endereco, cadastro_hotel_dadosx.endereco);
    strcpy((*(cadastro_hotel + (*contador))).nome_dono, cadastro_hotel_dadosx.nome_dono);
    strcpy((*(cadastro_hotel + (*contador))).email, cadastro_hotel_dadosx.email);
    (*contador)++;




}


int main(int argc, char** argv) {
   hotel_Home = 0;
                        while (hotel_Home != 5) {

                            printf(" 1 - Cadastrar Hotel \n");
                            printf(" 2 - Ver Hotel \n");
                            printf(" 3 - Editar Hotel \n");
                            printf(" 4 - Excluir Hotel \n");
                            printf(" 5 - Sair \n");
                            scanf("%d", &hotel_Home);
                            //Switch do Menu
                            switch (hotel_Home) {
                                    // Caso 1 para cadastrar Produtos
                                case 1:
                                    CadastroHotel(cadastro_hotel, &contador_hotel);
                                                                        cadastro_hospede = realloc(cadastro_hospede, (contador_hospede + 2) * sizeof (criar_Hospede));

                                   
                                    break; // Fecha o case do switch principal
                                case 2:
                                   
                                    // Parte para listar todos hoteis
                                    printf("----- Ver Hotel -----\n");
                                            verHotel(cadastro_hotel, contador_hotel);
                                            break; // Fecha o case 1
                                        
                                case 3:
                                   
                                   atualizaHotel();
                                    break; // Fecha o case 3
  
  
}

Bom esta seperado em bibliotecas, essa e a parte que estou tentando colocar com arquivos, vou postar sem pra voce ver tambem

adicionado 2 minutos depois

@KXSY

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct criar_Hotel {
    // declara todas as variaveis do cadastro dos dados do hotel //
    char nome_social[100];
    char razao_social[100];
    char inscricao_estadual[100];
    float cnpj;
    char endereco[100];
    float telefone;
    char email[100];
    char nome_dono[100];
    float telefone_dono;
    float horario_chegar;
    float horario_sair;
    float lucro_produtos_vendidos;
    //
} criar_Hotel;





// Cadastra os hoteis
void CadastroHotel(criar_Hotel *cadastro_hotel, criar_Hotel *cadastro_hotel_dados, int *contador) {
    (*(cadastro_hotel + (*contador))).cnpj = cadastro_hotel_dados->cnpj;
    (*(cadastro_hotel + (*contador))).horario_chegar = cadastro_hotel_dados->horario_chegar;
    (*(cadastro_hotel + (*contador))).horario_sair = cadastro_hotel_dados->horario_sair;
    (*(cadastro_hotel + (*contador))).lucro_produtos_vendidos = cadastro_hotel_dados->lucro_produtos_vendidos;
    (*(cadastro_hotel + (*contador))).telefone_dono = cadastro_hotel_dados->telefone_dono;
    (*(cadastro_hotel + (*contador))).telefone = cadastro_hotel_dados->telefone;
    strcpy((*(cadastro_hotel + (*contador))).nome_social, cadastro_hotel_dados->nome_social);
    strcpy((*(cadastro_hotel + (*contador))).razao_social, cadastro_hotel_dados->razao_social);
    strcpy((*(cadastro_hotel + (*contador))).inscricao_estadual, cadastro_hotel_dados->inscricao_estadual);
    strcpy((*(cadastro_hotel + (*contador))).endereco, cadastro_hotel_dados->endereco);
    strcpy((*(cadastro_hotel + (*contador))).nome_dono, cadastro_hotel_dados->nome_dono);
    strcpy((*(cadastro_hotel + (*contador))).email, cadastro_hotel_dados->email);
    (*contador)++;

}
// Verifica os hoteis
int VerificarHotel(criar_Hotel *cadastro_hotel, criar_Hotel *cadastro_hotel_dados, int contador) {
    int i, verificacao = 0;
    for (i = 0; i < contador; i++) {
        if (strcmp(cadastro_hotel_dados->nome_social, (*(cadastro_hotel + i)).nome_social) == 0)
            verificacao = 1;
    }

    return verificacao;
}
// Busca a posicao do vetor do hotel
int PosicaoHotel(criar_Hotel *cadastro_hotel, criar_Hotel *cadastro_hotel_dados, int contador) {
    int posicao = -1, i;
    for (i = 0; i <= contador; i++) {
        if (strcmp(cadastro_hotel_dados->nome_social, (*(cadastro_hotel + i)).nome_social) == 0)
            posicao = i;
    }

    return posicao;
}
// Atualiza o hotel
void atualizaHotel(criar_Hotel *cadastro_hotel, criar_Hotel *cadastro_hotel_dados, int contador, int posicao) {
    cadastro_hotel[posicao].cnpj = cadastro_hotel_dados->cnpj;
    cadastro_hotel[posicao].telefone = cadastro_hotel_dados->telefone;
    cadastro_hotel[posicao].telefone_dono = cadastro_hotel_dados->telefone_dono;
    cadastro_hotel[posicao].horario_chegar = cadastro_hotel_dados->horario_chegar;
    cadastro_hotel[posicao].horario_sair = cadastro_hotel_dados->horario_sair;
    cadastro_hotel[posicao].lucro_produtos_vendidos = cadastro_hotel_dados->lucro_produtos_vendidos;
    strcpy(cadastro_hotel[posicao].nome_social, cadastro_hotel_dados->nome_social);
    strcpy(cadastro_hotel[posicao].razao_social, cadastro_hotel_dados->razao_social);
    strcpy(cadastro_hotel[posicao].email, cadastro_hotel_dados->email);
    strcpy(cadastro_hotel[posicao].nome_dono, cadastro_hotel_dados->nome_dono);
    strcpy(cadastro_hotel[posicao].endereco, cadastro_hotel_dados->endereco);



}
// Mostra os hoteis

void verHotel(criar_Hotel *cadastro_hotel, int contador) {
    int i;
    for (i = 0; i < contador; i++) {
        printf("Nome Social:  %s ", (cadastro_hotel + i)->nome_social);
        printf("Razao Social: %s ", (cadastro_hotel + i)->razao_social);
        printf("Inscricao Estadual: %s ", (cadastro_hotel + i)->inscricao_estadual);
        printf("CNPJ: %f \n", (cadastro_hotel + i)->cnpj);
        printf("Endereco: %s ", (cadastro_hotel + i)->endereco);
        printf("Nome dono: %s ", (cadastro_hotel + i)->nome_dono);
        printf("Telefone Dono: %f \n", (cadastro_hotel + i)->telefone_dono);
        printf("E-mail: %s ", (cadastro_hotel + i)->email);
        printf("Horario Check-in: %f \n", (cadastro_hotel + i)->horario_chegar);
        printf("Horario Check-out: %f \n", (cadastro_hotel + i)->horario_sair);
        printf("Lucro Produtos Vendidos: %f \n", (cadastro_hotel + i)->lucro_produtos_vendidos);
        printf("Endereco: %s \n", (cadastro_hotel + i)->endereco);
    }
}

int main(){
// Menu inicial do Programa
    while (menu_principal != 6) {
        printf(" ----- Escolha uma opcao ----- \n");
        printf("----- 1 -  Modulo de Cadastro e Gestao de Dados -----\n");
        printf("----- 2 -  Modulo de Reservas -----\n");
        printf("----- 3 - Modulo de Transacoes -----\n");
        printf("----- 4 - Modulo de Feedback -----\n");
        printf("----- 5 - Modulo de Importacao/Exportacao -----\n");
        printf("----- 6 - Fechar Programa -----\n");
        scanf("%d", &menu_principal);
        switch (menu_principal) {
            case 6:
                printf(" ----- Programa Encerrado -----\n");
                //verificar_login_final = 0;
                break;
            default:
                printf(" Opcao Invalida");
                break;

            case 1:
                /*
                verificar_acesso0 = verificar_acessos(cadastro_operadores ,verificar_Posicao_login);
                verificar_acesso1 = verificar_acessos(cadastro_operadores ,verificar_Posicao_login);
                if(verificar_acesso0 == 0 & verificar_acesso1 == 0){
                    printf(" Acesso Negado");
                    break;
                }

                 */
                sub_menu_principal_cadastro = 0;
                printf(" ----- Area de Cadastro -----\n");
                printf(" Selecione uma opcao \n");
                printf("1 - Hotel\n");
                printf("2 - Hospede\n");
                printf("3 - Fornecedor\n");
                printf("4 - Produtos\n");
                printf("5 - Categoria de Acomodacao\n");
                printf("6 - Acomodacao\n");
                printf("7 - Operador\n");
                printf("8 - Sair\n");
                scanf("%d", &sub_menu_principal_cadastro);
                switch (sub_menu_principal_cadastro) {
                    case 8:
                        printf("Retornado\n");

                        break;
                    case 1:




                        // Inicio codigo do cadastro de Hotel
                        hotel_Home = 0;
                        while (hotel_Home != 5) {

                            printf(" 1 - Cadastrar Hotel \n");
                            printf(" 2 - Ver Hotel \n");
                            printf(" 3 - Editar Hotel \n");
                            printf(" 4 - Excluir Hotel \n");
                            printf(" 5 - Sair \n");
                            scanf("%d", &hotel_Home);
                            //Switch do Menu
                            switch (hotel_Home) {
                                    // Caso 1 para cadastrar Produtos
                                case 1:
                                    printf("Digite o nome Fantasia\n");
                                    setbuf(stdin, NULL);
                                    fgets(cadastro_hotel_dados.nome_social, 100, stdin);
                                    verificar_hotel = VerificarHotel(cadastro_hotel, &cadastro_hotel_dados, contador_hotel);
                                    if (verificar_hotel == 1) {
                                        printf(" Nome ja cadastrado tente outro \n");
                                        break;
                                    }
                                    printf(" Digite a Razao Social \n ");
                                    setbuf(stdin, NULL);
                                    fgets(cadastro_hotel_dados.razao_social, 100, stdin);
                                    printf(" Inscricao Estadual \n ");
                                    setbuf(stdin, NULL);
                                    fgets(cadastro_hotel_dados.inscricao_estadual, 100, stdin);
                                    printf(" Digite o Endereco \n ");
                                    setbuf(stdin, NULL);
                                    fgets(cadastro_hotel_dados.endereco, 100, stdin);
                                    printf(" Digite o E-mail \n ");
                                    setbuf(stdin, NULL);
                                    fgets(cadastro_hotel_dados.email, 100, stdin);
                                    printf(" Digite o nome do dono \n ");
                                    setbuf(stdin, NULL);
                                    fgets(cadastro_hotel_dados.nome_dono, 100, stdin);
                                    printf(" Digite o CNPJ \n ");
                                    scanf("%f", &cadastro_hotel_dados.cnpj);
                                    printf(" Digite o Telefone do dono \n ");
                                    scanf("%f", &cadastro_hotel_dados.telefone_dono);
                                    printf(" Digite o Telefone do Hotel \n ");
                                    scanf("%f", &cadastro_hotel_dados.telefone);
                                    printf(" Horario Check-in \n ");
                                    scanf("%f", &cadastro_hotel_dados.horario_chegar);
                                    printf(" Horario Check-out \n ");
                                    scanf("%f", &cadastro_hotel_dados.horario_sair);
                                    printf(" Lucro Produtos Vendidos \n ");
                                    scanf("%f", &cadastro_hotel_dados.lucro_produtos_vendidos);
                                    CadastroHotel(cadastro_hotel, &cadastro_hotel_dados, &contador_hotel);
                                    //Soma um na variavel Contadora
                                    cadastro_hotel = realloc(cadastro_hotel, (contador_hotel + 2) * sizeof (criar_Hotel));
                                    printf(" ----- Cadastrado com Sucesso ----- \n");
                                    break; // Fecha o case do switch principal
                                case 2:
                                    if (contador_hotel == 0) {
                                        printf(" ----- Nenhum Hotel Cadastrado\n");
                                        break;
                                    }
                                    // Parte para listar todos hoteis
                                    printf("----- Ver Hoteis -----\n");
                                    printf(" 1 - Ver todos\n");
                                    printf(" 2 - Pesquisar por Nome\n");
                                    scanf("%d", &listar_hoteis);
                                    switch (listar_hoteis) {
                                        case 1:
                                            verHotel(cadastro_hotel, contador_hotel);
                                            break; // Fecha o case 1
                                        case 2:
                                            printf(" ----- Pesquisar por Nome -----\n");
                                            printf(" ----- Digite o Nome do Hotel ----- \n");
                                            setbuf(stdin, NULL);
                                            fgets(cadastro_hotel_dados.nome_social, 100, stdin);
                                            posicao_hotel = PosicaoHotel(cadastro_hotel, &cadastro_hotel_dados, contador_hotel);
                                            if (posicao_hotel == -1) {
                                                printf("----- Hotel nao encontrado -----\n");
                                                break;
                                            }
                                            printf(" Nome Fantasia %s ", cadastro_hotel[posicao_hotel].nome_social);
                                            printf(" Razao Social %s  ", cadastro_hotel[posicao_hotel].razao_social);
                                            printf(" Inscricao Estadual %s  ", cadastro_hotel[posicao_hotel].inscricao_estadual);
                                            printf(" Endereco %s   ", cadastro_hotel[posicao_hotel].endereco);
                                            printf(" E-mail  %s ", cadastro_hotel[posicao_hotel].email);
                                            printf(" Nome do Dono %s  ", cadastro_hotel[posicao_hotel].nome_dono);
                                            printf(" CNPJ %f \n ", cadastro_hotel[posicao_hotel].cnpj);
                                            printf(" Telefone do Dono %f \n ", cadastro_hotel[posicao_hotel].telefone_dono);
                                            printf(" Telefone do Hotel %f  \n ", cadastro_hotel[posicao_hotel].telefone);
                                            printf(" Horario Check-in %f \n ", cadastro_hotel[posicao_hotel].horario_chegar);
                                            printf(" Horario Check-out %f \n ", cadastro_hotel[posicao_hotel].horario_sair);
                                            printf(" Lucro Produtos %f \n ", cadastro_hotel[posicao_hotel].lucro_produtos_vendidos);

                                            break; // fecha o case 2

                                    }// Fecha o switch de ver os produtos
                                    break; // Fecha o case 2
                                case 3:
                                    if (contador_hotel == 0) {
                                        printf(" ----- Nenhum Hotel cadastrado ----- \n");
                                        break;
                                    }
                                    // Realiza a atualizacao do hotel
                                    posicao_hotel = -1;
                                    printf(" ----- Editar Hoteis -----\n");
                                    // Pesquisa o hotel
                                    printf(" Digite o Nome Fantasia Hotel \n");
                                    setbuf(stdin, NULL);
                                    fgets(cadastro_hotel_dados.nome_social, 100, stdin);
                                    posicao_hotel = PosicaoHotel(cadastro_hotel, &cadastro_hotel_dados, contador_hotel);
                                    if (posicao_hotel == -1) {
                                        printf(" Hotel nao cadastrado \n");
                                        break;
                                    }
                                    printf(" ----- Hotel Encontrado ----- \n");
                                    printf(" Digite os novos dados \n");
                                    printf(" Digite o Nome Social \n ");
                                    setbuf(stdin, NULL);
                                    fgets(cadastro_hotel_dados.nome_social, 100, stdin);
                                    printf(" Digite a Razao Social \n ");
                                    setbuf(stdin, NULL);
                                    fgets(cadastro_hotel_dados.razao_social, 100, stdin);
                                    printf(" Inscricao Estadual \n ");
                                    setbuf(stdin, NULL);
                                    fgets(cadastro_hotel_dados.inscricao_estadual, 100, stdin);
                                    printf(" Digite o Endereco \n ");
                                    setbuf(stdin, NULL);
                                    fgets(cadastro_hotel_dados.endereco, 100, stdin);
                                    printf(" Digite o E-mail \n ");
                                    setbuf(stdin, NULL);
                                    fgets(cadastro_hotel_dados.email, 100, stdin);
                                    printf(" Digite o nome do dono \n ");
                                    setbuf(stdin, NULL);
                                    fgets(cadastro_hotel_dados.nome_dono, 100, stdin);
                                    printf(" Digite o CNPJ \n ");
                                    scanf("%f", &cadastro_hotel_dados.cnpj);
                                    printf(" Digite o Telefone do dono \n ");
                                    scanf("%f", &cadastro_hotel_dados.telefone_dono);
                                    printf(" Digite o Telefone do Hotel \n ");
                                    scanf("%f", &cadastro_hotel_dados.telefone);
                                    printf(" Horario Check-in \n ");
                                    scanf("%f", &cadastro_hotel_dados.horario_chegar);
                                    printf(" Horario Check-out \n ");
                                    scanf("%f", &cadastro_hotel_dados.horario_sair);
                                    printf(" Lucro Produtos Vendidos \n ");
                                    scanf("%f", &cadastro_hotel_dados.lucro_produtos_vendidos);
                                    atualizaHotel(cadastro_hotel, &cadastro_hotel_dados, contador_hotel, posicao_hotel);
                                    printf(" ----- Atualizado com Sucesso ----- \n");
                                    break; // Fecha o case 3
                                case 4:
                                    posicao_hotel = -1;
                                    deletar_hotel = 0;
                                    if (contador_hotel == 0) {
                                        printf(" ----- Nenhum Hotel Cadastrado ----- \n");
                                        break;
                                    }
                                    printf(" ----- Deletar Hotel ----- \n");
                                    printf(" Para deletar o Nome: \n");
                                    setbuf(stdin, NULL);
                                    fgets(cadastro_hotel_dados.nome_social, 100, stdin);
                                    posicao_hotel = PosicaoHotel(cadastro_hotel, &cadastro_hotel_dados, contador_hotel);
                                    if (posicao_hotel == -1) {
                                        printf(" ----- Hotel nao Cadastrado ----- \n");
                                        break;
                                    }
                                    printf(" ----- Hotel encontrado -----\n");
                                    printf(" ----- Deseja Realmente deletar? \n");
                                    printf(" 1 - Sim \n");
                                    printf(" 2 - Nao \n ");
                                    scanf("%d", &deletar_hotel);
                                    switch (deletar_hotel) {
                                        case 1:
                                            printf(" ----- Hotel Deletado -----\n");
                                            for (deletar_busca_hotel = 0; deletar_busca_hotel <= contador_hotel; deletar_busca_hotel++) {
                                                cadastro_hotel[posicao_hotel + deletar_busca_hotel].cnpj = cadastro_hotel[posicao_hotel + deletar_busca_hotel + 1].cnpj;
                                                cadastro_hotel[posicao_hotel + deletar_busca_hotel].telefone = cadastro_hotel[posicao_hotel + deletar_busca_hotel + 1].telefone;
                                                cadastro_hotel[posicao_hotel + deletar_busca_hotel].telefone_dono = cadastro_hotel[posicao_hotel + deletar_busca_hotel + 1].telefone_dono;
                                                cadastro_hotel[posicao_hotel + deletar_busca_hotel].horario_sair = cadastro_hotel[posicao_hotel + deletar_busca_hotel + 1].horario_sair;
                                                cadastro_hotel[posicao_hotel + deletar_busca_hotel].horario_chegar = cadastro_hotel[posicao_hotel + deletar_busca_hotel + 1].horario_chegar;
                                                cadastro_hotel[posicao_hotel + deletar_busca_hotel].lucro_produtos_vendidos = cadastro_hotel[posicao_hotel + deletar_busca_hotel + 1].lucro_produtos_vendidos;
                                                strcpy(cadastro_hotel[posicao_hotel + deletar_busca_hotel].nome_social, cadastro_hotel[posicao_hotel + deletar_busca_hotel + 1].nome_social);
                                                strcpy(cadastro_hotel[posicao_hotel + deletar_busca_hotel].razao_social, cadastro_hotel[posicao_hotel + deletar_busca_hotel + 1].razao_social);
                                                strcpy(cadastro_hotel[posicao_hotel + deletar_busca_hotel].email, cadastro_hotel[posicao_hotel + deletar_busca_hotel + 1].email);
                                                strcpy(cadastro_hotel[posicao_hotel + deletar_busca_hotel].inscricao_estadual, cadastro_hotel[posicao_hotel + deletar_busca_hotel + 1].inscricao_estadual);
                                                strcpy(cadastro_hotel[posicao_hotel + deletar_busca_hotel].nome_dono, cadastro_hotel[posicao_hotel + deletar_busca_hotel + 1].nome_dono);
                                                strcpy(cadastro_hotel[posicao_hotel + deletar_busca_hotel].endereco, cadastro_hotel[posicao_hotel + deletar_busca_hotel + 1].endereco);


                                            }
                                            contador_hotel--;
                                            cadastro_hotel = realloc(cadastro_hotel, (contador_hotel + 2) * sizeof (criar_Hotel));
                                            break;
                                        case 2:
                                            printf(" Produto nao deletado \n");
                                            break;
                                        default:
                                            printf(" Comando invalido \n");
                                    }

                                    break; // Fecha o case 4
                                default:
                                    printf(" Comando Invalido \n");
                                    break;
                                case 5:
                                    printf(" ----- Retornado -----");
                                    break;
                            }

                        }


                        break;



}

Eu quero implementar a mesma funcionalidade que faz ai so que com arquivos, a solução que pensei seria toda vez que abrisse o programa as struct voltassem como estavam e continuaria normal o programa

Compartilhar este post


Link para o post
Compartilhar em outros sites
11 minutos atrás, marechalmelo disse:

Bom esta seperado em bibliotecas, essa e a parte que estou tentando colocar com arquivos, vou postar sem pra voce ver tambem

vou sugerir uma abordagem diferente, mas você vai ter que reescrever todo o código.

 

Utilizando listas encadeadas pode resolver o problema de uma maneira mais pratica.

Exemplo:

/* Cadastro simples */
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>


/* Constantes */
#define T_NOME 20
#define T_TELEFONE 10

/* tipos */
typedef struct
{
  char nome[T_NOME];
  char telefone[T_TELEFONE];
}TCliente;

typedef struct Lista
{
  TCliente cliente;
  struct Lista *proximo;
}TLista;

int main()
{
  TLista *inicio=NULL,*ponteiro;
  char tecla;
  /* Cadastro */
  do
  {
    TCliente cliente;
    printf("\nDigite o nome do cliente:\t");
    fgets(cliente.nome,T_NOME,stdin);
    printf("\nDigite o numero do cliente:\t");
    fgets(cliente.telefone,T_TELEFONE,stdin);
    /* Cria uma lista encadeada */
    if(!inicio)   /* Se for igual a NULL */
    {
      ponteiro=inicio=malloc(sizeof(TLista));
      if(!inicio)   /* Erro */
        return(-1);
      inicio->cliente=cliente;
      inicio->proximo=NULL;
    }
    else
    {
      ponteiro=ponteiro->proximo=malloc(sizeof(TLista));
      if(!ponteiro)   /* Erro */
        return(-1);
      ponteiro->cliente=cliente;
      ponteiro->proximo=NULL;
    }
    printf("\nDeseja sair S/N:\t");
    scanf("%c",&tecla);
    getchar();
  }while(toupper(tecla)!='S');
  /* Mostra a lista */
  ponteiro=inicio;
  while(ponteiro)
  {
    printf("\nNome:\t%s\nTelefone:\t%s",ponteiro->cliente.nome,ponteiro->cliente.telefone);
    ponteiro=ponteiro->proximo;
  }
  /* Apaga a lista */
  ponteiro=inicio;
  while(ponteiro)
  {
    inicio=ponteiro->proximo;
    free(ponteiro);
    ponteiro=inicio;
  }
  return(0);
}

Agora se você quiser continuar com a mesma abordagem veja o final deste outro aqui.

/* Cadastro simples */
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>


/* Constantes */
#define T_NOME 20
#define T_TELEFONE 10
#define T_ID 3
#define ID "IF"
#define NOME_ARQUIVO "dados.bin"

/* tipos */
typedef struct
{
  char nome[T_NOME];
  char telefone[T_TELEFONE];
}TCliente;

typedef struct Lista
{
  TCliente cliente;
  struct Lista *proximo;
}TLista;

typedef struct
{
  char id[T_ID];
  unsigned short q_registros;
}TCabecalho;

int main()
{
  TLista *inicio=NULL,*ponteiro;
  TCliente *clientes=NULL;
  TCabecalho cab;
  FILE *arq;
  char tecla;
  int cont=0;
  /* Abre o arquivo */
  arq=fopen(NOME_ARQUIVO,"rb+");
  if(!arq)    /* Se o arquivo não existir */
  {
    arq=fopen(NOME_ARQUIVO,"wb+");
    /* Cadastro */
    do
    {
      TCliente cliente;
      printf("\nDigite o nome do cliente:\t");
      fgets(cliente.nome,T_NOME,stdin);
      printf("\nDigite o numero do cliente:\t");
      fgets(cliente.telefone,T_TELEFONE,stdin);
      /* Cria uma lista encadeada */
      if(!inicio)   /* Se for igual a NULL */
      {
        ponteiro=inicio=malloc(sizeof(TLista));
        if(!inicio)   /* Erro */
          return(-1);
        inicio->cliente=cliente;
        inicio->proximo=NULL;
      }
      else
      {
        ponteiro=ponteiro->proximo=malloc(sizeof(TLista));
        if(!ponteiro)   /* Erro */
          return(-1);
        ponteiro->cliente=cliente;
        ponteiro->proximo=NULL;
      }
      printf("\nDeseja sair S/N:\t");
      scanf("%c",&tecla);
      getchar();
    }while(toupper(tecla)!='S');
    /* Mostra a lista */
    ponteiro=inicio;
    while(ponteiro)
    { 
      printf("\nNome:\t%s\nTelefone:\t%s",ponteiro->cliente.nome,ponteiro->cliente.telefone);
      ponteiro=ponteiro->proximo;
      cont++;   /* Conta a quantidade de registros */
    }
    /* Salva a lista em um arquivo */
    strcpy(cab.id,ID);
    cab.q_registros=cont;
    /* Primeiro registro do arquivo */
    fwrite(&cab,sizeof(TCabecalho),1,arq);
    ponteiro=inicio;
    while(ponteiro)
    {
      fwrite(&ponteiro->cliente,sizeof(TCliente),1,arq);
      ponteiro=ponteiro->proximo;
    }
    /* Passa para um vetor */
    clientes=malloc(sizeof(TCliente)*cont);
    if(!clientes) /* Erro */
      return(-1);
    /* Passa a lista para o vetor */
    cont=0;
    ponteiro=inicio;
    while(ponteiro)
    {
      clientes[cont]=ponteiro->cliente;
      ponteiro=ponteiro->proximo;
    }
    /* Apaga a lista */
    ponteiro=inicio;
    while(ponteiro)
    {
      inicio=ponteiro->proximo;
      free(ponteiro);
      ponteiro=inicio;
    }
  }
  /* Recupera os regitros do arquivo */
  if(!clientes)
  {
    fread(&cab,sizeof(TCabecalho),1,arq);
    if(strcmp(cab.id,ID))   /* Erro */
      return(-1);
    clientes=malloc(sizeof(TCliente)*cab.q_registros);
    if(!clientes)   /* Erro */
      return(-1);
    for(cont=0; cont<cab.q_registros; cont++)
      fread(&clientes[cont],sizeof(TCliente),1,arq);
  }
  for(cont=0; cont<cab.q_registros; cont++)
    printf("\nNome:\t%s\nTelefone:\t%s",clientes[cont].nome,clientes[cont].telefone);
  /* Apaga o vetor */
  free(clientes);
  /* Fecha o arquivo */
  fclose(arq);
  return(0);
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá

 

O termo para o que você quer fazer é serialização --- serialization --- e é muito muito comum. Em maior ou menor alcance quase todos os programas tem que fazer algo assim. Nem que seja apenas para buscar informações de configuração, última posição na tela, dados de usuário ou o último arquivo aberto.

 

Não descreveu os problemas que está tendo com sua solução. Mas o problema mais comum está no fato do sistema inserir bytes de alinhamento --- packing ---  na gravação da estrutura e depois na hora de ler pode e fica desalinhado e portanto inútil.

 

Você não disse o compilador que está usando. O que eu geralmente uso --- Microsoft Visual Studio --- tem uma instrução #pragma que resolve isso. Não sei se é igual em outros compiladores, faz tempo que não uso C ou C++ em outro ambiente. Você precisa se certificar que esse recurso, packing, está desativado e que vai gravar a struct byte a byte. Ou então saber o padrão de sua máquina --- par, ímpar, múltiplo de algo --- para gravar de acordo. No caso da Microsoft você usa 

#pragma pack(push, 1)

e aí ele passa a gravar byte a byte e depois

#pragma pack(pop) 

para voltar ao que estava antes. Sim, é usada uma estrutura tipo pilha --- stack.

 

Em geral é isso que causa problemas.

Recomendo esquecer esse lance de seek() porque é outro pesadelo. Pense como nase classes em C++: você cria um construtor para suas struct e um destrutor:

  • No inicio do processamento das structs você abre o arquivo, lê todo mundo e carrega sua estrutura de dados
  • No final você cria um arquivo novo e grava tudo
  • Depois que terminou e deu tudo certo você renomeia o antigo para algo como .back ou põe um ponto na frente do nome no caso de Unix e derivados
  • Depois você finalmente muda o nome do arquivo novo para o nome original, já com tudo garantido

Trabalhar ao vivo com o arquivo de dados e em especial atualizar o arquivo na execução não vale o risco

 

Se o volume de dados é muito grande para carregar na estrutura na memória meu primeiro palpite seria o que todo mundo faz: usar um banco de dados. E não por acaso SQLite é provavelmente o programa de computador mais usado no mundo, dentre todas as categorias: grátis, sólido, continuamente atualizado e rápido pra *****. E funciona em qualquer sistema e em qualquer linguagem. :D

 

Não perca tempo testando isso no meio de seu programa. Faça um pequeno programa que cria umas estruturas, grava e tenta ler de volta, e poste aqui os resultados

Compartilhar este post


Link para o post
Compartilhar em outros sites

@arfneto eu estou com problema exclusivamente no erro de carregar a struct eu não sei qual é o comando que eu utilizo para recarrerelarregada como estava quando fecho o programa poderia me ajudar 

adicionado 0 minutos depois

@KXSY pode me explicar qual é esse comando de receber a struct do arquivo é salvala? Esse carregamento 

Compartilhar este post


Link para o post
Compartilhar em outros sites
47 minutos atrás, arfneto disse:

Você não disse o compilador que está usando.

a maioria do fórum usa Dev-C++ (que geralmente vem com uma versão velha do GCC) pelo simples fato do "Next->Next->Install".

47 minutos atrás, arfneto disse:

O que eu geralmente uso --- Microsoft Visual Studio

Eu não recomendo o Microsoft visual studio pra ninguém que tá aprendendo C, pelo simples fato que eu uma vez esqueci uma chave e ganhei de brinde um FATAL ERROR (fora que o suporte a C e uma variante da própria microsoft).

 

Recomendo LLVM-Clang, mas para um usuário windows e a mesma coisa de tentar pilotar a enterprice.

adicionado 4 minutos depois
6 minutos atrás, marechalmelo disse:

pode me explicar qual é esse comando de receber a struct do arquivo é salvala? Esse carregamento

/* Volta a quantidade de registros gravados */fwrite(/* Passe a struct como ponteiro aqui */,/* Tamanho da estrutura Exemplo:sizeof(criar_Hotel)*/,/* Quantidade de vezes que e para gravar no arquivo */,/* ponteiro do arquivo */);

 

adicionado 7 minutos depois

tem uma referencia aqui fwrite em inglês, se você estiver usando o chrome e só pedir para traduzir.

Compartilhar este post


Link para o post
Compartilhar em outros sites
19 horas atrás, marechalmelo disse:

gostaria que toda vez que iniciasse o programa o arquivo carregase e mandasse novamente para a struct tipo algo assim: sei que esta errado mas e nesse raciocinio

 

Como eu te disse, isso é absolutamente comum. Como sabe que está errado?

 

16 horas atrás, arfneto disse:

Você não disse o compilador que está usando. O que eu geralmente uso --- Microsoft Visual Studio --- tem uma instrução #pragma que resolve isso. Não sei se é igual em outros compiladores, faz tempo que não uso C ou C++ em outro ambiente. Você precisa se certificar que esse recurso, packing, está desativado e que vai gravar a struct byte a byte. Ou então saber o padrão de sua máquina --- par, ímpar, múltiplo de algo --- para gravar de acordo

 

@marechalmelo você entendeu o que falei sobre esse troço de packing? uEu acho que não ficou claro porque você não respondeu  e por outro lado @KXSY achou que eu estava recomendando um compilador. Vou explicar melhor e mostrar um exemplo. Tenha paciência :D 

 

16 horas atrás, marechalmelo disse:

eu estou com problema exclusivamente no erro de carregar a struct eu não sei qual é o comando que eu utilizo para recarrerelarregada como estava quando fecho o programa poderia me ajudar 

 

Preciso perguntar o que fez pra ter certeza que seu problema é gravar. O que está fazendo para ler? Se tem um erro na leitura pode achar que gravou errado... De qualquer forma, use fread() para ler e fwrite() para gravar e estará bem.

 

16 horas atrás, KXSY disse:

Eu não recomendo o Microsoft visual studio pra ninguém que tá aprendendo C, pelo simples fato que eu uma vez esqueci uma chave e ganhei de brinde um FATAL ERROR (fora que o suporte a C e uma variante da própria microsoft).

 

Recomendo LLVM-Clang, mas para um usuário windows e a mesma coisa de tentar pilotar a enterprice.

adicionado 4 minutos depois

 

Nem me passou pela cabeça recomendar um compilador porque não tem nada a ver com a discussão; E por outro lado escolher um compilador ou a linguagem muitas vezes não é afinal nossa opção. Patrões e clientes não costumam dar essa opção, escolas também não. Muitas universidades usam Python para cursos de introdução e para análise de dados, mas outras preferem R. Cursos de estruturas de dados são em geral voltados a linguagem que a escola prefere, seja C++, C ou java ou Pascal ou sei lá. Meus primeiros cursos de análise numérica eram voltados a FORTRAN e ponto final, por exemplo.

 

De volta ao tópico

Escrevi um programa para ajudar a entender do que estou falando

 

Veja sua estrutura criar_Hotel:

typedef struct criar_Hotel {
    // declara todas as variaveis do cadastro dos dados do hotel //
    char PRINCIPIO;
    char nome_social[100];
    char razao_social[100];
    char inscricao_estadual[100];
    float cnpj;
    char endereco[100];
    char MEIO;
    float telefone;
    char email[100];
    char nome_dono[100];
    float telefone_dono;
    float horario_chegar;
    float horario_sair;
    float lucro_produtos_vendidos;
    char FIM;
    //
} criar_Hotel;

Eu inseri 3 caracteres, PRINCIPIO, MEIO e FIM como pode ver. E vou gravar isso em disco e ler depois pra você entender. Isso está além do que se usa nesses exercícios de curso, mas é o dia a dia quando você precisa criar ou ler arquivos que foram gerados em outro lugar por outros sistemas. Imagino que já tenha olhado isso, mas se olhar sua estrutura vai ver que tem 6 vetores de 100 bytes 6 float que podem ter 4 ou 8, e eu coloquei 3 char de um byte provavelmente. Isso soma 624 bytes mais os 3 que inventei, 627.

Vou gravar esses 3 caracteres [|] no inicio no meio e no fim de cada struct porque assim podemos conferir na leitura se permanece alinhado. Sim, é um teste besta :D 


Esse é o programa de teste

int            main(int argc, char** argv)
{
    printf("sizeof(criar_Hotel) = %d sizeof(float) = %d\n",
        sizeof(criar_Hotel), sizeof(float));
    cria("hoteis.xyz", 2);
    cria("hoteis.xyz", 4);
    le("hoteis.xyz");

    cria("mais-hoteis.xyz", 10);
    le("mais-hoteis.xyz");
    return 0;
}

E uso essas funções:

int             cria(char*, int);
criar_Hotel*    fabrica();
int             le(char*);

cria() faz o simples: abre o arquivo em modo "a" e grava n structs cria_Hotel bem bonitinhas, numeradas para a gente poder ver se algo se perdeu. E com aqueles delimitadores [ e ] no inicio e no fim e o | la pelo meio

le() abre o arquivo e le de volta todas as structs e ve se os delimitadores estão no lugar. Eis o que ela mostra para esse trecho de main() com hoteis.txt vazio inicialmente:

    cria("hoteis.xyz", 2);
    cria("hoteis.xyz", 4);
    le("hoteis.xyz");

Mostra

le(hoteis.xyz)
Arquivo de entrada com 3816 bytes, ao menos 6 structs
   1: Leu 'Nome Social 001', [|] = '[' '|' ']'
   2: Leu 'Nome Social 002', [|] = '[' '|' ']'
   3: Leu 'Nome Social 003', [|] = '[' '|' ']'
   4: Leu 'Nome Social 004', [|] = '[' '|' ']'
   5: Leu 'Nome Social 005', [|] = '[' '|' ']'
   6: Leu 'Nome Social 006', [|] = '[' '|' ']'
todos os delimitadores OK!


Como funciona?
Antes de tudo, vê o tamanho do arquivo e divide pelo tamanho da struct, porque assim você pode ter uma ideia de quantas alocar no início de seu programa. Recomendo usar uma outra estutura de dados e não um vetor, mas é seu programa e seria outra discussão. Como vê essa está ok: inserimos 2 e depois 4 e o tamanho está ok. e ao ler cada registro testamos os 3 caracteres [|] pra ver se estão lá. no final a função confirma se todos estavam ok, começando por '[' terminando por ']' e tal. As structs são geras com nomes fixos,mas numerados por exemplo "Nome Social NNN" porque assim fica óbvio algum problema: Elas são numeradas, tem um começo [ e um fim ] determinados e ninguém precisa ficar digitando p#$$@ nenhuma. Pode chamar cria("muitoshoteis.abc", 999) e testar um bom número.

 

Como grava as struct{}

    for (int i = 0; i < q; i += 1)
    {
        criar_Hotel* hotel = fabrica();
        n = fwrite(hotel, size, 1, hoteis);
        free(hotel);
    }

Onde q é o parâmetro de quantidade. fwrite() grava uma por vez. E a função fabrica() faz a gentileza de alocar um registro preenchido certinho a cada chamada assim o loop fica mais legível.


E as contas com o tamanho?

    stat(arquivo, &info);
    printf("Arquivo %s fechado com %d bytes, ao menos %d structs\n",
        arquivo, info.st_size, info.st_size/size);

Simples: Vê o tamanho do arquivo divide pelo tamanho da estrutura e mostra. 

 

E essa fabrica() é assim

criar_Hotel* fabrica()
{
    static int id = 0;
    criar_Hotel* h = (criar_Hotel*)malloc(sizeof(criar_Hotel));
    if (h == NULL) return NULL;

    id += 1;
    h->PRINCIPIO = '[';
    h->MEIO = '|';
    h->FIM = ']';

    sprintf(h->nome_social, "Nome Social %03d", id);
    sprintf(h->razao_social, "Razao Social %03d", id);
    sprintf(h->inscricao_estadual, "Inscricao Estadual %03d", id);
    h->cnpj = (float)id;
    h->endereco[0] = 0;
    h->telefone = (float)id;
    h->email[0] = 0;
    h->nome_dono[0] = 0;
    h->telefone_dono = (float)id;
    h->horario_chegar = (float)id;
    h->horario_sair = (float)id;
    h->lucro_produtos_vendidos = (float)id;
    return h;
}    // end fabrica()

Coloca os delimitadores, gera o registro todo preenchido e retorna. Bem melhor que ficar 5 minutos na tela do programa pra digitar 5 hoteís.

Rodando esse main() e tentando chegar a alguma conclusão.

Eis a saída:

sizeof(criar_Hotel) = 636 sizeof(float) = 4
cria(hoteis.xyz,2)
Arquivo hoteis.xyz fechado com 1272 bytes, ao menos 2 structs
cria(hoteis.xyz,4)
Arquivo hoteis.xyz fechado com 3816 bytes, ao menos 6 structs


le(hoteis.xyz)
Arquivo de entrada com 3816 bytes, ao menos 6 structs
   1: Leu 'Nome Social 001', [|] = '[' '|' ']'
   2: Leu 'Nome Social 002', [|] = '[' '|' ']'
   3: Leu 'Nome Social 003', [|] = '[' '|' ']'
   4: Leu 'Nome Social 004', [|] = '[' '|' ']'
   5: Leu 'Nome Social 005', [|] = '[' '|' ']'
   6: Leu 'Nome Social 006', [|] = '[' '|' ']'
todos os delimitadores OK!
cria(mais-hoteis.xyz,10)
Arquivo mais-hoteis.xyz fechado com 6360 bytes, ao menos 10 structs


le(mais-hoteis.xyz)
Arquivo de entrada com 6360 bytes, ao menos 10 structs
   1: Leu 'Nome Social 007', [|] = '[' '|' ']'
   2: Leu 'Nome Social 008', [|] = '[' '|' ']'
   3: Leu 'Nome Social 009', [|] = '[' '|' ']'
   4: Leu 'Nome Social 010', [|] = '[' '|' ']'
   5: Leu 'Nome Social 011', [|] = '[' '|' ']'
   6: Leu 'Nome Social 012', [|] = '[' '|' ']'
   7: Leu 'Nome Social 013', [|] = '[' '|' ']'
   8: Leu 'Nome Social 014', [|] = '[' '|' ']'
   9: Leu 'Nome Social 015', [|] = '[' '|' ']'
  10: Leu 'Nome Social 016', [|] = '[' '|' ']'
todos os delimitadores OK!

Note que o sistema reporta 636 como tamanho da struct... E era pra ter 600 + 24 + 3 = 627 se não errei na conta... Acho que afinal entendeu o problema. E porque expliquei sobre o padding ou packing ou alinhamento ou sei lá como chamam isso em seu sistema. E foi por isso que perguntei sobre o compilador e tal. E mostrei a diretiva #pragma pack() com exemplo, e não fui muito claro, a ponto de @KXSY achar que eu estava recomendando o compilador que eu uso.
Se você gravar em um sistema e tentar ler em outro vai ter claro problemas.


Eis o programa todo:

#define            _CRT_SECURE_NO_WARNINGS
#define            MODO_DE_GRAVACAO    "a"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "sys/stat.h"

typedef struct criar_Hotel {
    // declara todas as variaveis do cadastro dos dados do hotel //
    char PRINCIPIO;
    char nome_social[100];
    char razao_social[100];
    char inscricao_estadual[100];
    float cnpj;
    char endereco[100];
    char MEIO;
    float telefone;
    char email[100];
    char nome_dono[100];
    float telefone_dono;
    float horario_chegar;
    float horario_sair;
    float lucro_produtos_vendidos;
    char FIM;
    //
} criar_Hotel;

int                cria(char*, int);
criar_Hotel*    fabrica();
int                le(char*);

    
int            main(int argc, char** argv)
{
    printf("sizeof(criar_Hotel) = %d sizeof(float) = %d\n",
        sizeof(criar_Hotel), sizeof(float));
    cria("hoteis.xyz", 2);
    cria("hoteis.xyz", 4);
    le("hoteis.xyz");

    cria("mais-hoteis.xyz", 10);
    le("mais-hoteis.xyz");
    return 0;
}


int            cria(char* arquivo, int q)
{
    FILE* hoteis = fopen(arquivo, MODO_DE_GRAVACAO);
    struct stat        info;
    int                n;
    const int        size = sizeof(criar_Hotel);

    printf("cria(%s,%d)\n", arquivo, q);
    for (int i = 0; i < q; i += 1)
    {
        criar_Hotel* hotel = fabrica();
        n = fwrite(hotel, size, 1, hoteis);
        free(hotel);
    }
    fclose(hoteis);

    stat(arquivo, &info);
    printf("Arquivo %s fechado com %d bytes, ao menos %d structs\n",
        arquivo, info.st_size, info.st_size / size);
    return 0;
}    // end cria()


criar_Hotel* fabrica()
{
    static int id = 0;
    criar_Hotel* h = (criar_Hotel*)malloc(sizeof(criar_Hotel));
    if (h == NULL) return NULL;

    id += 1;
    h->PRINCIPIO = '[';
    h->MEIO = '|';
    h->FIM = ']';

    sprintf(h->nome_social, "Nome Social %03d", id);
    sprintf(h->razao_social, "Razao Social %03d", id);
    sprintf(h->inscricao_estadual, "Inscricao Estadual %03d", id);
    h->cnpj = (float)id;
    h->endereco[0] = 0;
    h->telefone = (float)id;
    h->email[0] = 0;
    h->nome_dono[0] = 0;
    h->telefone_dono = (float)id;
    h->horario_chegar = (float)id;
    h->horario_sair = (float)id;
    h->lucro_produtos_vendidos = (float)id;
    return h;
}    // end fabrica()


int            le(char* arquivo)
{
    FILE* hoteis = fopen(arquivo, "r");
    criar_Hotel        hotel;
    struct stat        info;
    int                n;
    int                ok = 0;
    int                seq = 0;
    const int        size = sizeof(criar_Hotel);

    stat(arquivo, &info);
    printf("\n\nle(%s)\nArquivo de entrada com %d bytes, ao menos %d structs\n",
        arquivo, info.st_size, info.st_size / size);

    while (1)
    {
        seq += 1;
        n = fread(&hotel, size, 1, hoteis);
        if (n <= 0) break;
        printf("%4d: Leu '%s', [|] = '%c' '%c' '%c'\n",
            seq, hotel.nome_social,
            hotel.PRINCIPIO, hotel.MEIO, hotel.FIM);
        if (hotel.PRINCIPIO != '[' || hotel.MEIO != '|' || hotel.FIM != ']')
            ok = 1;
    }    // end while

    if (ok == 1)
        printf("PROBLEMA com alinhamento\n");
    else
        printf("todos os delimitadores OK!\n");

    fclose(hoteis);
    return 0;
}    // end le()

E agora?
Na mesma maquina não deve ter problema, mas o certo é fazer o que eu disse e identificar o comando que define o padding como 1 byte. Isso existe por uma questão de eficiência. De  todo modo o que está nesse programa e nessa discussão resolve o seu problema. Escreva de volta e mostre seu programa como ficou!
 

Muda algo com pack = 1 mesmo?
 Pois é: veja a mesma execução definindo pack para 1

sizeof(criar_Hotel) = 627 sizeof(float) = 4
cria(hoteis.xyz,2)
Arquivo hoteis.xyz fechado com 1254 bytes, ao menos 2 structs
cria(hoteis.xyz,4)
Arquivo hoteis.xyz fechado com 3762 bytes, ao menos 6 structs


 

 

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
Em 12/11/2019 às 19:42, KXSY disse:

Eu não recomendo o Microsoft visual studio pra ninguém que tá aprendendo C, pelo simples fato que eu uma vez esqueci uma chave e ganhei de brinde um FATAL ERROR (fora que o suporte a C e uma variante da própria microsoft).

Também não recomendo! Porque existe alternativa melhor então não faz sentido.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...