Jump to content
Fórum Script Brasil
  • 0

Substituir dados em arquivos binário


Cleber Griff
 Share

Question

Galera, to com um probleminha aqui em um trabalho da facul. Aqui está a descrição do que estou com problema.

2- Considere os seguintes arquivos binários:

• “contas.bin”: contém registros de contas bancárias de uma

determinada agência. Cada registro armazena as seguintes

informações sobre uma conta bancária: número da conta

(cadeia de 5 caracteres), nome do cliente (cadeia de 40

caracteres) e saldo (valor real);

• “moviment.bin”: contém registros de movimentações feitas

(depósitos ou saques) em contas bancárias. Cada registro

armazena as seguintes informações sobre uma movimentação:

número da conta movimentada (cadeia de 5 caracteres), tipo

da movimentação (um caractere, podendo ser ‘S’ para saque e

‘D’ para depósito) e valor da movimentação (valor real).

Faça um programa que atualize o saldo das contas bancárias

contidas no arquivo “contas.bin” de acordo com as

movimentações contidas no arquivo “moviment.bin”.

Como eu atualizo os dados de um arquivo binário? Não faço ideia :~(

Eu posto o código mais tarde, se for necessário. Ele ficou meio confuso.

Link to comment
Share on other sites

3 answers to this question

Recommended Posts

  • 0

Valeu, PedroCunha.

Mas só posso usar C :~~

Consegui fazer o programa, fica aí pra quem precisar

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

typedef struct contas{ //Tipo de dado que caracteriza a criação de uma conta
    char num_conta[5], nome[40];
    float saldo;
}contas;

typedef struct transacoes{ //Tipo de dado referente a uma transação
    float valor;
    char tipo_trans, num_conta[5];
}transacoes;

void cria_conta(){ //Função para criar uma nova conta
    FILE *fp;
    contas nova_conta;

    fp = fopen("contas.bin", "ab+"); //Abre ou cria o arquivo contas.bin para adicionar dados

    if(fp == NULL){
        printf("Erro ao abrir arquivo");
        exit(1);
    }

    else{
        system("cls");

        //A seguir, captura os dados referentes à nova conta

        printf("=== NOVA CONTA ===");

        printf("\nNome do cliente: ");
        gets(nova_conta.nome);

        printf("\nNo. da conta (5 digitos): ");
        gets(nova_conta.num_conta);

        printf("\nSaldo: ");
        scanf("%f", &nova_conta.saldo);
        fflush(stdin);

        fwrite(&nova_conta, sizeof(contas), 1, fp); //Grava os dados em contas.bin
        fclose(fp);

        printf("\n\nDados salvos com sucesso!\n\n");
        system("pause");
    }
}

void verifica_saldo(){ //Função para verificar o saldo de determinada conta
    FILE *fp;
    contas conta;
    int busca_conta, encontrou=0; //Encontrou é usado para verificar se a conta existe

    fp = fopen("contas.bin", "rb"); //Abre contas.bin para leitura

    if(fp == NULL){
        printf("Erro na abertura do arquivo");
        exit(2);
    }

    else{
        system("cls");
        printf("Informe os 5 digitos do No. da conta: ");
        scanf("%d", &busca_conta); //Captura os dígitos da conta que o usuário deseja
        fflush(stdin);

        while(!feof(fp)){ //Varre o arquivo contas.bin até encontrar o fim do arquivo
            fread(&conta, sizeof(contas), 1, fp); //Armazena a informação na variável conta

            if(atoi(conta.num_conta)== busca_conta){ //Converte a string conta.num_conta para inteiro e compara com busca_conta
                printf("\n\nConta %s\nSaldo: %.2f\n\n", conta.num_conta, conta.saldo); //Exibe os dados da conta
                encontrou=1; //Altera o estado de encontrou para 1
                break;
            }
        }

        if(encontrou==0) printf("\nNada encontrado!\n\n"); //Case encontrou esteja em 0, nenhum arquivo foi encontrado. Isso é exibido ao usuário
        system("pause");
        }
    }

void faz_transacao(){ //Função para realizar uma transação
    FILE *contasbin; //Vai abrir o arquivo contas.bin
    FILE *movimentbin; //Vai abrir o arquivo moviment.bin
    transacoes trans; //Variável para armazenar a transação
    contas id; //Variável para armazenar a conta
    int encontrou=0;

    contasbin = fopen("contas.bin", "rb+"); //Abre contas.bin para leitura e gravação (atualizar os dados)

    if(contasbin==NULL){
        printf("\nErro ao abrir o arquivo contas.bin");
        exit(1);
    }

    else{
        movimentbin = fopen("moviment.bin", "ab+"); //Só tenta abrir moviment.bin se existir contas.bin

        if(movimentbin==NULL){
            printf("\nErro ao abrir o arquivo moviment.bin");
            exit(2);
        }

        else{
            system("cls");

        //Se os arquivos contas.bin e moviment.bin estiverem criados e abertos, então recolhe os dados da transação

            printf("==== NOVA TRANSACAO ====");

            printf("\n\nNo. da conta: ");
            gets(trans.num_conta);

            while(!feof(contasbin)){ //Varre o arquivo até o final
                fread(&id, sizeof(contas), 1, contasbin); //Lê os dados de contas.bin e armazena em id

                if(atoi(id.num_conta)==atoi(trans.num_conta)){ //Converte as string para inteiro e compara-as
                    encontrou=1; //Muda o estado de encontrou para 1
                    printf("\nConta %s\nSaldo atual: %.2f", id.num_conta, id.saldo);

                    printf("\n\nTipo de transacao \n(S - Saque / D- Deposito)\n   >>> ");
                    scanf("%c", &trans.tipo_trans); //Captura o tipo de transação (Saque ou Depósito)
                    fflush(stdin); //Limpa o buffer do teclado
                    trans.tipo_trans=toupper(trans.tipo_trans); //Transforma o caractere para maiúsculo

                    printf("\n\nValor da transacao: ");
                    scanf("%f", &trans.valor);
                    fflush(stdin);

                    if(trans.tipo_trans=='S'){ //Se a opção escolhida foi saque
                        id.saldo=id.saldo-trans.valor;

                        fseek(contasbin, (-1)*sizeof(contas), SEEK_CUR); //Leva o cursor para o início da conta atualmente em id
                        fwrite(&id, sizeof(contas), 1, contasbin); //Grava os novos dados da conta

                        printf("Novo saldo da conta %s\n%.2f\n\n", id.num_conta, id.saldo);

                        break;
                    }

                    if(trans.tipo_trans=='D'){ //Se a opção foi depósito
                        id.saldo=id.saldo+trans.valor;

                        fseek(contasbin, (-1)*sizeof(contas), SEEK_CUR); //Leva o cursor para o início da conta atualmente em id
                        fwrite(&id, sizeof(contas), 1, contasbin); //Grava os novos dados da conta

                        printf("Novo saldo da conta %s\n%.2f\n\n", id.num_conta, id.saldo);

                        break;
                    }
                }
            }

            if(encontrou==0) printf("\nConta não encontrada\n\n"); //Caso a variável encontrou armazenar 0, a conta não foi encontrada
            if(encontrou==1) fwrite(&trans, sizeof(transacoes), 1, movimentbin); //Caso contenha 1, a transação foi realizada e é então salva em moviment.bin

            //Fecha os arquivos
            fclose(contasbin);
            fclose(movimentbin);

            system("pause");
        }
    }
}

int main(int argc, char *argv[]){
    int opt;
    do{ //Exibe um menu com as opções até a opção de SAIR ser selecionada
        system("cls");
        printf("Escolha uma opcao:\n1- Criar conta\n2- Verificar saldo\n3- Realizar transacao\n4- Sair\n\t\t>>> ");
        scanf("%d", &opt);
        fflush(stdin);

        if(opt==1) cria_conta();
        if(opt==2) verifica_saldo();
        if(opt==3) faz_transacao();
    }while(opt!=4);

    return 0;
}

Edited by Cleber Griff
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share



  • Forum Statistics

    • Total Topics
      150.2k
    • Total Posts
      647.4k
×
×
  • Create New...