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

Banco de dados em .txt usando a linguagem C


keytous

Pergunta

Boa tarde.

Pessoal tenho um trabalho a fazer, onde devo manipular dados em um banco .txt. (cadastrar, consultar, excluir).

Meu problema Inicial: Gravar arquivos de uma struct no meu .txt.

---------------------------------------------------------------------------------

# include <stdio.h>
int main (){
FILE *file;
file = fopen ("banco.txt", "w");
int i;
struct pessoa{
char nome[50];
int idade;
};
struct pessoa cadastro[2];
printf ("Cadastro de Pessoas:\n\n");
for (i=0; i < 2; i++){
printf ("\nNome: "); fgets (cadastro.nome, 50, stdin);
printf ("Idade: "); scanf ("%d", &cadastro.idade);
getchar ();
}
return 0;
}
---------------------------------------------------------------------------------------
Sei que na forma q esta apenas cria o arquivo .txt, e as entradas de dados não são gravadas no mesmo. Minha dificuldade é justamente essa.
Obrigado !!
Editado por keytous
Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 0

Acho que deveria de dar uma olhada aqui: #2 já teve um usuário com o mesmo problema.

Nesse link comento uma coisa muito importante antes de entrar no tema dos arquivos que é o Byte aligne.

E também tem a forma de escrever no arquivo que estas buscando.

De esse exercício saiu esta solução que apesar de estar um 95% em C, contem cosas de C++ como referencias.

#include <stdio.h>
#include <ctype.h>   // para tolower


FILE* fileManager(){
    FILE* arquivo;
    char modo;  //opção
    char* nomeArquivo = "prova.txt";
    
    printf("Escolha um modo para abrir o arquivo \n\nG-Escritura \nL-Leitura \nA-Anexão \n\n?: ");
    scanf("%c%*c", &modo);
    modo = tolower(modo); //<-pasamos a minuscula 
    
    switch ( modo ) { //Vai verificar o modo
        case 'g':
            //G - É para gravação,o parametro wt
            arquivo = fopen ( nomeArquivo, "wt" ); //Só permite escrever no arquivo, borra conteudo anterior
            break;
            
        case 'l':
            //l - É para leitura  do texto
            arquivo = fopen ( nomeArquivo, "r" ); //modo leitura, no hace falta poner t, por default ja é t, si nao por b(binario), começa do principio.
            break;
            
        case 'a':
            //A- É para append(anexação)
            arquivo = fopen ( nomeArquivo, "a" ); //Modo Anexar só permite escrever ao fin do arquivo, nao importa si tentar mover o descriptor de arquivo, sempre vai anexar ao fin evitando borrar conteudo.
            break;
    }
    

    if ( arquivo == NULL ) { //A diretiva NULL em letras maiusculas,é quando a pontar para o espaço da memoria NULO,ou NULL,caso o arquivo não exista
        perror("Desculpe! "); //<-importante para saber que tipo de erro tivemos ao tentar abrir
        
        //fazemos uma pausa
        printf("\nPulse uma tecla para continuar...");
        scanf("%*c");
        
        //como nao conseguimos abrir o arquivo retornamos NULL que no apunta a nada.
        return NULL;
    }else{  
        //Si conseguimos abrir informamos do exito.
        printf("O arquivo %s esta aberto em modo %s\n", nomeArquivo, (modo=='g')? "gravação.":(modo=='a')? "anexão.": "leitura."  );
    }
    
    //Si chegamos aqui é por que o arquivo esta aberto e agora retornamos ele como foi pedido.
    return arquivo;
}//FIN fileManager

void finalizar ( FILE *arquivo ) { //Está função vai fechar o arquivo
    fclose ( arquivo );
}//FIN finalizar


//////MAIN////////
int main() {
    FILE* arquivo = fileManager(); //a variavel arquivo recebe o ponteiro ao arquivo.

    if( arquivo == NULL ){
        return 1; // si o programa retornar 1 é por que nao abrio o arquivo nao temos por que fechar ele, saimos aqui mesmo.
    }


    finalizar(arquivo); // si passou pela comprovaçao anterior é preciso fechar o arquivo antes de sair ja que nao vamos fazer mais nada.
    return 0;
}//FIN MAIN

com algo de mudanças acho que você pode adaptar ele perfeitamente a suas necessidades.

O programa le um nome, telefone particular e celular e um email.

Ele pode tomar dados de um contato e guardar ele no arquivo, pode listar todo o arquivo na tela, pode borrar um contato do arquivo, pode ordenar o arquivo limpando dos contatos eliminados etc etc.

cada função é independente da outra, uma guarda, outra lê, outra, limpa tela, outra lista, outra organiza......

Guarda ele como .cpp e veja como funciona.

Link para o comentário
Compartilhar em outros sites

  • 0

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

FILE* AbreArquivo(char modo, char caminho[30]){
    FILE *arquivo;
    switch(modo){
        case 'g':
            arquivo = fopen(caminho,"wt");
            break;
        case 'l':
            arquivo = fopen(caminho,"rt");
            break;
        case 'a':
            arquivo = fopen(caminho,"a");
            break;
    }
    if(arquivo==NULL){      //Se houver algum erro, o ponteiro apontará para NULL
        printf("Nao foi possivel abrir o arquivo");
        exit(0);
    }
    return arquivo;
}

void FecharArquivo(FILE *arquivo){
    fclose(arquivo);
}

void Cadastra(char nome[30], int telefone){
    FILE *arquivo;
    arquivo = AbreArquivo('a', "vendas.txt");
    fprintf(arquivo, "%s %d\n", nome, telefone);
    FecharArquivo(arquivo);
}

void Listar(){
    FILE *arquivo;
    char nome[30];
    int telefone;

    arquivo = AbreArquivo('l',"vendas.txt");

    while(!feof(arquivo)){
        fscanf(arquivo,"%s %d ", &nome, &telefone);
        printf("Nome: %s  -  Telefone: %d\n", nome, telefone);
    }
    FecharArquivo(arquivo);
}

int main(){
    int opcao;
    char nome[30];
    int telefone;
    do{
        system("cls");
        printf("\n\n\t\tBem Vindo ao programa AGENDA\n");
        printf("\nMENU");
        printf("\n 1 - Registrar Venda");
        printf("\n 2 - Listar venda");
        printf("\n 3 - Sair");

        printf("\nDigite uma opcao: ");
        scanf("%d", &opcao);
        system("cls");

        switch(opcao){
            case 1:
                printf("\nDigite o nome: ");
                setbuf(stdin,NULL);
                gets(nome);
                printf("\nDigite o telefone: ");
                scanf("%d", &telefone);
                Cadastra(nome, telefone);
                system("pause");
                break;
            case 2:
                Listar();
                system("pause");
                break;
            case 3:
                printf("\n\nFinalizando...\n\n");
                system("pause");
                exit(0);
                break;

            default:
                printf("\n\nOpcao invalida! Tente Novamente!\n\n");
                system("pause");

        }
    }while(opcao!=3);

    return 0;
}

Adapte ao seu gosto.

Editado por Barao
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,1k
    • Posts
      651,8k
×
×
  • Criar Novo...