Ir para conteúdo
Fórum Script Brasil
  • 0

Gravar e Ler em Arquivo.


Ervilha

Pergunta

Fiz um programa de agenda com as seguintes opções...

(1) -> Inserir Novo Cadastro:

(2) -> Excluir um Cadastro:

(3) -> Pesquisar um Cadastro:

(4) -> Listar Todos os Cadastros:

(0) -> Para Sair

Tudo funciona certinho, usando Struct, Função, Ponteiros, numa Lista Duplamente Encadeada.

Agora eu estava querendo colocar duas novas funções...

(5) -> Gravar no Arquivo:

(6) -> Ler do Arquivo

A idéia é, usar o programa na memória, e quando eu apertar ele gravar em um arquivo txt ou binário tanto faz.

Para quando eu abrir o programa de novo apenas apertar para ler e ele jogar tudo na memória de novo.

Como gravar direto quando eu for inserindo eu sei, mas queria fazer desse jeito.

Se alguém puder me dar uma mão, estou postando o código abaixo.

// Projeto_Veiculos.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "tool.h"
#include <dos.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include <iostream>

/* ---------------------------------------------------------------- */

struct _no    // define a estrutura do processo
{
    struct _no *anterior;
    char nome[40], rua[100], bairro[50], cidade[50], estado[10], cep[15], telefone[15];
    struct _no *proximo;
};

/* ---------------------------------------------------------------- */

typedef struct _no No;

No *Raiz=NULL;        // define um ponteiro para o numero raiz
No *Ultimo=NULL;    // define um ponteiro para o ultimo numero

/* ---------------------------------------------------------------- */

void Insere(char *nome, char *rua, char *bairro, char *cidade, char *estado, char *cep, char *telefone) 
{
    No *Atual;
    No *NoAnterior;
    No *NoPosterior;
    No *NovoNo;    

    if (Raiz==NULL)        // Verifica se o nó na raiz é nulo, que é o caso quando a lista está vazia.
    {                    // Se for, cria nó na raiz com os dados fornecidos e faz o último nó coincidir com ele.
        Raiz = new No;
        strcpy (Raiz->nome,nome);
        strcpy (Raiz->rua,rua);
        strcpy (Raiz->bairro,bairro);
        strcpy (Raiz->cidade,cidade);
        strcpy (Raiz->estado,estado);
        strcpy (Raiz->cep,cep);
        strcpy (Raiz->telefone,telefone);
        Raiz->proximo = NULL;
        Raiz->anterior = NULL;
        Ultimo = Raiz;
    }
    else 
    {          
        NoAnterior = NULL;    // se já houver raiz percorre a lista duplamente encadeada, comecando da raiz.
        Atual = Raiz;        // inicialmente, não há nó anterior.

        while (Atual!=NULL) 
        {
            if (strcmp(Atual->nome,nome)>=0)
            {
                break;    // verifica se o nó atual é igual, se for superior pára
            }
            else 
            {
                NoAnterior = Atual;
                Atual = Atual->proximo;
            }
        }

        if (Atual!=NULL) // só faz a comparação abaixo se existe o nó Atual
        {
            if (strcmp(Atual->nome,nome)==0) 
            {
                printf ("\n\n Nome já existente!\n");
                printf ("\n\n\n\n ");
                system("pause");
                system("cls");
                return;
            }

            NoPosterior = Atual;        // insere um novo nó entre o nó atual e o nó anterior        
            NovoNo = new No;            // aloca memória para o novo nó            
            strcpy (NovoNo->nome,nome);    // coloca dados no nó a ser inserido
            strcpy (NovoNo->rua,rua);
            strcpy (NovoNo->bairro,bairro);
            strcpy (NovoNo->cidade,cidade);
            strcpy (NovoNo->estado,estado);
            strcpy (NovoNo->cep,cep);
            strcpy (NovoNo->telefone,telefone);

            NovoNo->proximo = NoPosterior;    // atualiza ponteiros do novo nó
            NovoNo->anterior = NoAnterior;

            if (NoAnterior != NULL)    // atualiza ponteiros dos nós vizinhos
            {
                NoAnterior->proximo = NovoNo;
            }
            if (NoPosterior != NULL)
            {
                NoPosterior->anterior = NovoNo;
            }            
            if (NovoNo->anterior == NULL)    // verifica se o novo nó foi inserido no início ou no fim da lista se foi,
            {                                // atualiza referências
                Raiz = NovoNo;
            }
            if (NovoNo->proximo == NULL)
            {
                Ultimo = NovoNo;
            }
        }
    }
}

/* ---------------------------------------------------------------- */

void Lista() 
{
    int ciclos;
    No *Atual;
    Atual = Raiz;
    ciclos=1;

    while(Atual!=NULL)        // percorre a lista duplamente encadeada desde a raiz
    {
        system("cls");
        printf("\n\n Reg. N: %d",ciclos);
        printf("\n Nome: %s\n Rua: %s\n Bairro: %s\n Cidade: %s\n Estado: %s\n CEP: %s\n Telefone: %s\n",Atual->nome,Atual->rua,Atual->bairro,Atual->cidade,Atual->estado,Atual->cep,Atual->telefone);
        Atual=Atual->proximo;
        ciclos++;
    }
    printf ("\n\n\n\n ");
    system("pause");
    system("cls");
}

/* ---------------------------------------------------------------- */

void Deleta(char *nome) 
{
    No *Atual;
    No *Anterior=NULL;
    No *Posterior;

    Atual = Raiz;

    while (Atual!=NULL)    // primeiro, percorre a lista duplamente encadeada desde a raiz
    {        
        if (strcmp(Atual->nome,nome)>=0)    // verifica se já encontrei ou já passei do nome procurado
        {
            break;
        }
        else  // se ainda não passou
        {  
            Anterior = Atual;
            Atual = Atual->proximo;
        }
    }

    if (Atual!=NULL)
        Posterior = Atual->proximo;


    if (Atual != NULL)    // verifica se o nó atual é mesmo o nó procurado
        if (strcmp(Atual->nome,nome)==0)    // se for, deleta faz com que o nó subsequente ao atual seja o subsequente ao nó anterior para manter a integridade da lista
        {              
            if (Atual != Raiz)
            {
                Anterior->proximo = Atual->proximo;
            }
            else  // se o no atual é a raiz, atualizo a referência para a raiz
            {
                Raiz = Atual->proximo;
            }            
            if (Atual != Ultimo)    // faz com que a referência para o nó anterior do próximo nó seja
            {                        // o nó anterior ao que será deletado, para manter a integridade
                Posterior->anterior = Anterior;
            }
            else    // se o nó atual é o último, atualiza a referência para o último
            {
                Ultimo = Anterior;
            }            
            free(Atual);    // agora, o nó atual morreeeee!!!!
            printf ("\n\n Nome deletado! \n\n");
            printf ("\n\n ");
            system("pause");
            system("cls");
            return;
        }
        printf("\n\n não achei!\n");
        printf ("\n\n\n\n ");
        system("pause");
        system("cls");
}

/* ---------------------------------------------------------------- */

void Pesquiza(char *nome)
{        
    No *Atual;
    Atual = Raiz;

    while (Atual!=NULL)
    {
        if (strcmp(Atual->nome,nome)>=0)
        {
            break;
        }
        else
        {
            Atual = Atual->proximo;
        }
    }

    if (Atual!=NULL)
    {
        if (strcmp(Atual->nome,nome)==0)
        {
            system("cls");
            printf("\n Nome: %s\n Rua: %s\n Bairro: %s\n Cidade: %s\n Estado: %s\n CEP: %s\n Telefone: %s\n",Atual->nome,Atual->rua,Atual->bairro,Atual->cidade,Atual->estado,Atual->cep,Atual->telefone);
            printf("\n\n\n\n ");
            system("pause");
            system("cls");
            return;
        }
    }

    printf("\n\n Nome não encontrado!");    

    printf("\n\n ");
    system("pause");
    system("cls");
}

/* ---------------------------------------------------------------- */

void main () 
{
    int opcao;
    char nome[40], rua[100], bairro[50], cidade[50], estado[10], cep[15], telefone[15];

    do 
    {
        printf("\n\n *************************************** \n *          AGENDA DE TELEFONE         * \n *************************************** \n *  (1) -> Inserir Novo Cadastro:      * \n *  (2) -> Excluir um Cadastro:        * \n *  (3) -> Pesquizar um Cadastro:      * \n *  (4) -> Listar Todos os Cadastros:  * \n *  (5) -> Gravar no Arquivo:          * \n *  (6) -> Ler do Arquivo              * \n *  (0) -> Para Sair                   * \n *************************************** \n\n --> ");
        scanf("%d",&opcao);

        if (opcao == 1 || opcao == 2 || opcao == 3) 
        {
            fflush(stdin);
            printf("\n\n Digite o Nome: " );            
            gets(nome);            
        }

        switch (opcao) 
        {
        case 1: 
            {    
                fflush(stdin);                
                printf(" Digite a Rua e o N da casa: " );            
                gets(rua);
                fflush(stdin);
                printf(" Digite o Bairro: " );            
                gets(bairro);    
                fflush(stdin);
                printf(" Digite a Cidade: " );            
                gets(cidade);    
                fflush(stdin);
                printf(" Digite o Estado: " );            
                gets(estado);    
                fflush(stdin);
                printf(" Digite o CEP: " );            
                gets(cep);
                fflush(stdin);
                printf(" Digite o Telefone: " );            
                gets(telefone);
                fflush(stdin);
                system("cls");
                Insere(nome,rua,bairro,cidade,estado,cep,telefone); 
                break;
            }
        case 2: 
            {
                Deleta(nome); 
                break;
            }
        case 3: 
            {
                Pesquiza(nome); 
                break;
            }
        case 4: 
            {
                Lista();                
                break;
            }
        case 5: 
            {                                                
                break;
            }
        case 6: 
            {                                
                break;
            }
        }
    } while (opcao != 0);
} 

/* ---------------------------------------------------------------- */

Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...