Jump to content
Fórum Script Brasil
  • 0

Banco de dados em .txt usando a linguagem C


keytous
 Share

Question

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 !!
Edited by keytous
Link to comment
Share on other sites

4 answers to this question

Recommended Posts

  • 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 to comment
Share on other 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.

Edited by Barao
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.1k
    • Total Posts
      647.1k
×
×
  • Create New...