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

Substituir dados em arquivos binário


Cleber Griff

Pergunta

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 para o comentário
Compartilhar em outros sites

3 respostass a esta questão

Posts Recomendados

  • 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;
}

Editado por Cleber Griff
Link para o comentário
Compartilhar em outros sites

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...