keytous Posted May 18, 2015 Report Share Posted May 18, 2015 (edited) 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 May 18, 2015 by keytous Quote Link to comment Share on other sites More sharing options...
0 vangodp Posted May 18, 2015 Report Share Posted May 18, 2015 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. Quote Link to comment Share on other sites More sharing options...
0 keytous Posted May 18, 2015 Author Report Share Posted May 18, 2015 Obrigado vangodf mas minha ideia não é bem essa, não adianta eu copiar o teu código e ficar com duvidas, por isso filtrei ao máximo meu programa para poder ir entendendo gradualmente. Obrigado !! Quote Link to comment Share on other sites More sharing options...
0 vangodp Posted May 19, 2015 Report Share Posted May 19, 2015 Então tá. De nada. Quote Link to comment Share on other sites More sharing options...
0 Barao Posted May 20, 2015 Report Share Posted May 20, 2015 (edited) #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 May 20, 2015 by Barao Quote Link to comment Share on other sites More sharing options...
Question
keytous
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.
---------------------------------------------------------------------------------
Link to comment
Share on other sites
4 answers to this question
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.