Ir ao conteúdo
  • Cadastre-se
Rafael Carvalho Alencar

C++ RESOLVIDO programa em c++ que leia arquivo txt e salve valores em struct

Recommended Posts

Bom dia/tarde/noite.

Estou desenvolvendo um programa para praticar c++, só que estou com um problema.

O programa vai precisar de uma struct Usuarios:

 

struct Usuarios{
int codigo[5];
char nome[15];
char sobrenome[30];
char cargo[30];
};

int main(){
int i; // valor que o usuario vai digitar para identificar a que usuario está se referindo.
Usuarios usuario;

 

O programa tem que salvar cada item dessa estrutura e sua determinada posição no arquivo e depois ser capaz de ler o arquivo e colocar cada item na sua posição nas variaves(usando o codigo da estrutura que ao abrir da ao programa a indicação de que posição ele tem que ficar).

 

ex: salvei um usuario Codigo: 5792 Nome: Rafael Sobrenome:Carvalho Cargo: Admin. Todos eles vão ficar armazenados em usuario[5792].variavel ao serem salvos e na hora de abrir o arquivo.

 

Quem souber me salva, por favor.

 

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá! Tudo certo?

Então ...

 

Parece que seu código ficou incompleto após um erro sua postagem.

 

 

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi, boa noite. Não, na verdade isso aí é só um exemplo. do que eu preciso.

Botei a struct e as variaves pra onde preciso mandar minhas informações.

Agradeço atenção!

adicionado 19 minutos depois

Mas pra deixar mais claro, é simples, eu preciso que o programa:

 

1 - (caso já encontre um arquivo) Pegue as informações desse arquivo e insira em seus respectivos lugares. São elas nome, sobrenome, cargo, código.

2 - Essas informações precisam ir até uma Struct Usuarios.

3 - Depois dos passos anteriores ele tem que salvar todos os danos novamente no arquivo junto com algum que o usuário tenha cadastrado.

 

Isso em um arquivo TXT porque eu não manjo de MySQL. :(

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Rafael Carvalho Alencar     para isso seu arquivo txt precisa ter esse formato aqui  :

19  nome sobrenome cargo

onde o primeiro é um número e o segundo e o terceiro e o quarto são uma palavra ( string )  separados por pelo menos hum espaço em branco ,   então  essa parte inicial do seu código poderia ser assim  :

#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <stdlib.h>
#include <ctype.h>

struct Usuarios{
    int  codigo[    5];
    char nome[     15];
    char sobrenome[30];
    char cargo[    30];
};
struct Usuarios usuario[100];
int main(){
    int i=0; // valor que o usuario vai digitar para identificar a que usuario está se referindo.

    FILE *arq=fopen("arquivo_de_dados.txt","a+");/* cria o arquivo txt e bre para leitura e escrita no final */
    if(arq==NULL){printf("erro no arquivo !\n");exit(0);}

    while( fscanf(arq, "%d" , &usuario[i].codigo[0])!= EOF &&  /* aqui pega do arquivo e coloca na struct    */
           fscanf(arq, "%s" , &usuario[i].nome     )!= EOF &&  /* seguindo nessa ordem  */
           fscanf(arq, "%s" , &usuario[i].sobrenome)!= EOF &&  /* no arquivo precisa estar nessa mesma ordem */
           fscanf(arq, "%s" , &usuario[i].cargo    )!= EOF ){
           i++;
    }

    fclose(arq);            /* fecha o arquivo */
    int tam_struct = i;     /* informa a posição da struct onde vai colocar novos dados */
    char op;
    printf("\nQual o n%cmero do usu%crio ",233,160);/* esses números se refrem às letras ú  á ASCII */
    fflush(stdin);
    scanf("%d",&i);       /* pegando o numero de codigo do usuario */
    if(i<tam_struct){
        printf("codigo  ---: %d\n",usuario[0].codigo[0]);/* imprim os dados referente ao usuário */
        printf("nome ------: %s\n",usuario[0].nome     );
        printf("sobrenome -: %s\n",usuario[0].sobrenome);
        printf("cargo -----: %s\n",usuario[0].cargo    );
    }

depois se incluir ou modificar os dados na struct , você usa o comando fprintf para gravar os novos dados no arquivo txt .

  • Curtir 1
  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá, parceiro! Valeu pela dica, sou iniciante no C++.

Me diga, como eu faria nesse caso:

 

O programa leu 2 linhas:

1 Rafael Carvalho Admin - > usuario[0]

2 Joao Almeida Admin ->usuario[1]

 

Se eu inserir um usuário na posição usuario[2], qual o código para o programa salvar?

Cara se tu tiver interessado te pago 30ntão pra tu por esse código num projeto que eu comecei aqui.

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Rafael Carvalho Alencar    para gravar no arquivo txt você usa o comando fprintf  :

usuario[2].codigo[0] = 15;               /* aqui o usuario que foi incluido  */
strcpy(usuario[2].nome , "Alfredo");/*  foi incluido com o comando strcpy mas pode usar também  scanf  */
strcpy(usuario[2].sobrenome , "Silva");
strcpy(usuario[2].cargo , "Gerente");
 
/*  essa parte será colocada no final do programa antes do rerturn   */

arq=fopen("arquivo_de_dados.txt","w");      /* abre o arquivo e reseta ele para gravar desde o inicio do arquivo */
for(j=0;j<tam_struct;j++){
    fprintf(arq, "%d " , usuario[j].codigo[0]);  /* grava no arquivo txt */
    fprintf(arq, "%s " , usuario[j].nome     );  /* grava no arquivo txt */
    fprintf(arq, "%s " , usuario[j].sobrenome);  /* grava no arquivo txt */
    fprintf(arq, "%s " , usuario[j].cargo    );  /* grava no arquivo txt */
}
fclose(arq);    /*  fecha o arquivo senão dará erros  */  

poste seu código para vermos como está e em que podemos ajudar   .

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá amigo. Eu "consegui" criar o menu para salvar os usuarios, mas de um jeito que ele salva o todos os usuarios no arquivo de uma vez, toda vez que eu cadastro um novo usuario.  Se alguem souber como fazer isso de forma que ele adicione só o usuario que eu acabei de cadastrar no arquivo seria melhor. E tambem um método que exclua algum usuario.

 

#include<iostream>
#include<stdio.h>
#include<conio2.h>
#include<stdlib.h>
#include<string.h>
#include<fstream>

using namespace std;

FILE *arquser=fopen("dbusers.db", "a+");

struct Usuarios{
    char nome[        30];
    char sobrenome[   30];
    char cargo[       30];
    char cpf[         30];
    char rg[          30];
    char senha[       15];
};
Usuarios usuario[9999];
int tam_struct = 0;

void Listar();
void Cadastrar();
void Deletar();
void Inicio();

int main(void){

    int i = 0;
    bool repete = true;


    if(arquser==NULL){printf("Erro no arquivo !\n");exit(0);}

    while(  fscanf(arquser, "%s", usuario[i].nome      ) != EOF &&
            fscanf(arquser, "%s", usuario[i].sobrenome ) != EOF &&
            fscanf(arquser, "%s", usuario[i].cargo     ) != EOF &&
            fscanf(arquser, "%s", usuario[i].rg        ) != EOF &&
            fscanf(arquser, "%s", usuario[i].cpf       ) != EOF &&
            fscanf(arquser, "%s", usuario[i].senha     ) ){
            i++;
            tam_struct++;
            }
    fclose(arquser);


    Inicio();
}

void Inicio()
{
    // INTERFACE
    int op;
    bool repete = true;

    do{
    system("cls");
    printf("\n\tBEM VINDO - Usuarios - %d \n", tam_struct);
    printf("\n 1 - Ver Usuarios Cadastrados.\n 2 - Cadastrar Novo Usuario.\n 3 - Excluir Usuario\n 4 - Sair");
    printf("\n Sua escolha: ");
    scanf("%d", &op);
    switch(op){
    case 1:
        Listar();
        break;

    case 2:
        Cadastrar();
        break;

    case 3:
        void Deletar();
        break;

    case 4:
        repete == false;
        break;

        }

    }while(repete);
}
void Listar(){
    int i=0;
    int u=0;
    system("cls");
        for(i=0;i<tam_struct;i++){
        u++;
        printf("\n\tUSUARIO %d:", u);
        printf("\nNOME: %s %s.", usuario[i].nome, usuario[i].sobrenome);
        printf("\nCARGO: %s.", usuario[i].cargo);
        printf("\nCPF: %s", usuario[i].cpf);
        printf("\nRG: %s", usuario[i].rg);
        printf("\n====================================");
        }

        getch();
        Inicio();
}

void Cadastrar(){
    int i = 0;
    int u = 2;
    char temp[30] = "";
    system("cls");
    i = tam_struct;
    u == i;
    printf("\tUSUARIO %u", u);
    printf("\n NOME: ");
    scanf("%s", &temp);
    strcpy(usuario[i].nome, temp);
    temp == "";
    printf("\n SOBRENOME: ");
    scanf("%s", &temp);
    strcpy(usuario[i].sobrenome, temp);
    temp == "";
    printf("\n CARGO: ");
    scanf("%s", &temp);
    strcpy(usuario[i].cargo, temp);
    temp == "";
    printf("\n CPF: ");
    scanf("%s", &temp);
    strcpy(usuario[i].cpf, temp);
    temp == "";
    printf("\n RG: ");
    scanf("%s", &temp);
    strcpy(usuario[i].rg, temp);
    temp == "";
    printf("\n SENHA: ");
    scanf("%s", &temp);
    strcpy(usuario[i].senha, temp);
    char s[10] = " ";
    char f[10] = "\n";
    tam_struct++;
    int gravar = 0;

    FILE *arqgravar=fopen("dbusers.db", "wt");

    while(gravar<tam_struct){
    fprintf(arqgravar, usuario[gravar].nome);
    fprintf(arqgravar, s);
    fprintf(arqgravar, usuario[gravar].sobrenome);
    fprintf(arqgravar, s);
    fprintf(arqgravar, usuario[gravar].cargo);
    fprintf(arqgravar, s);
    fprintf(arqgravar, usuario[gravar].cpf);
    fprintf(arqgravar, s);
    fprintf(arqgravar, usuario[gravar].rg);
    fprintf(arqgravar, s);
    fprintf(arqgravar, usuario[gravar].senha);
    fprintf(arqgravar, f);
    gravar++;
    }

    fclose(arqgravar);


    printf("\n\n Pronto! Pressione qualquer botao.");
    getch();
    Inicio();
}

 

adicionado 22 minutos depois

Eu sou novo em programação, mas acho que isso que eu fiz se chama "GAMBIARRA NO CÓDIGO". KKKKK

  • Curtir 1
  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Rafael Carvalho Alencar    seu código está bom ,  então para gravar os dados seria melhor no final  do código , quando tiver usado o programa e ter feito outros cadastrado e modificado , etc ... então ele grava tudo de uma vez , então seu código com algumas modificações poderia ser assim  :

#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <stdlib.h>
#include <ctype.h>
#include <windows.h>
/*             0     1    2     3   4      5      6      7         8  */
typedef enum{BLACK,BLUE,GREEN,CYAN,RED,MAGENTA,BROWN,LIGHTGRAY,DARKGRAY,   /* nome das cores */
LIGHTBLUE,LIGHTGREEN,LIGHTCYAN,LIGHTRED,LIGHTMAGENTA,YELLOW,WHITE} COLORS;
/*  9         10         11        12        13         14    15 */

static int __BACKGROUND = 1/*BLACK*/;/*pode ser o numero ou o nome da cor*/
static int __FOREGROUND = LIGHTGRAY;

void textcolor (int letras, int fundo){/*para mudar a cor de fundo mude o background*/
    __FOREGROUND = letras;
    __BACKGROUND = fundo;
    SetConsoleTextAttribute (GetStdHandle (STD_OUTPUT_HANDLE),
    letras + (__BACKGROUND << 4));
}


void gotoxy(int x, int y){
    COORD c;
    c.X = x;
    c.Y = y;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),c);
}

struct   Usuarios     {
    int  codigo[    5];
    char nome[     15];
    char sobrenome[30];
    char cargo[    30];
};
struct Usuarios usuario[100];
void imprime(int j){
    printf("  codigo  ---: %d\n"  ,usuario[j].codigo[0]);  /* imprime os dados referente ao usuário */
    printf("  nome ------: %s\n"  ,usuario[j].nome     );
    printf("  sobrenome -: %s\n"  ,usuario[j].sobrenome);
    printf("  cargo -----: %s\n\n",usuario[j].cargo    );
}
int main(){
    textcolor(12,15);
    system("cls");
    int i=0,j=0,w,flag; // valor que o usuario vai digitar para identificar a que usuario está se referindo.
    int carac[8]={179,47,196,92,179,47,196,92};
    int tam_struct,opc;                        /* informa a posição da struct onde vai colocar novos dados */
    char op,cod[10];

    FILE *arq=fopen("arquivo_de_dados.txt","a+");/* cria o arquivo txt e abre para leitura e escrita no final */
    if(arq==NULL){printf("erro no arquivo !\n");exit(0);}

    printf("Lista com todos os usuarios cadstrados !\n\n");
    while( fscanf(arq, "%d" , &usuario[j].codigo[0])!= EOF  &&  /* aqui pega do arquivo e coloca na struct    */
           fscanf(arq, "%s" , &usuario[j].nome     )!= EOF  &&  /* seguindo nessa ordem  */
           fscanf(arq, "%s" , &usuario[j].sobrenome)!= EOF  &&  /* no arquivo precisa estar nessa mesma ordem */
           fscanf(arq, "%s" , &usuario[j].cargo    )!= EOF  ){
           imprime(j);
           j++;
    }
    fclose(arq);                                                /* fecha o arquivo */
    tam_struct=j;
    printf("    Tecle !");
    getch();
    do{
        system("cls");
        printf("\n\n                                        Menu\n\n\n");
        printf("                              1 - Listar hum usuario\n");
        printf("                              2 - Listar Todos usuario\n");
        printf("                              3 - Cadastrar usuario\n");
        printf("                              4 - Excluir hum usuario\n");
        printf("                              5 - Alterar hum usuario\n");
        printf("                              6 - sair do programa\n\n");

        for(j=1;j<41;j++){
            if(j<12){
                gotoxy(20,j);
                printf("%c",186);
                gotoxy(60,j);
                printf("%c",186);
            }
            gotoxy(j+19,1);
            printf("%c",205);
            gotoxy(j+19,3);
            printf("%c",205);
            gotoxy(j+19,12);
            printf("%c",205);
        }
        gotoxy(60,1 );printf("%c",187);
        gotoxy(20,1 );printf("%c",201);
        gotoxy(20,12);printf("%c",200);
        gotoxy(60,12);printf("%c",188);
        gotoxy(60,3 );printf("%c",185);
        gotoxy(20,3 );printf("%c",204);
        gotoxy(30,14);
        printf("Opcao : ");
        opc = getch()-48;                                      /* pegando o numero de codigo do usuario        */
        printf("\n");
        switch( opc ){
        case 1 :
            flag=0;
            printf("Qual o n%cmero do usu%crio ",233,160);     /* esses números se refrem às letras ú  á ASCII */
            fflush(stdin);
            scanf("%d",&i);                                    /* pegando o numero de codigo do usuario        */
            for(j=0;j<tam_struct;j++)
                if(usuario[j].codigo[0] == i ){
                    imprime(j);
                    flag=1;
                }
            if( ! flag )printf("\nCodigo inexistente !\n");
            printf("        Tecle ");
            getch();
            break;
        case 2 :
            for(j=0;j<tam_struct;j++){
                imprime(j);
            }
            if( ! j)printf("\nNenhum usuario cadastrado !\n");
            printf("      Tecle !");
            getch();
            break;
        case 3 :
            printf("\nCadastrando usuario\n\n");
            do{
                do{
                    printf("codigo usuario ");
                    fflush(stdin);              /* limpa o buffer do teclado para não pegar sujeira que esteja lá */
                    scanf("%s", cod );          /* pega o codigo do usuario em uma string                         */
                    flag=0;                     /* flag igual falso                                               */
                    for(j=0;j<strlen(cod);j++)  /* percorre todos os caracteres da string                         */
                        if( ! isdigit(cod[j]))  /* se algum caractere não for um digito de zero a nove            */
                            flag=1;             /* flag igual verdadeiro                                          */
                    if( flag )                  /* se flag verdaeiro                                              */
                        printf("O codigo precisa ser só numeros , e nesse tem caracteres invalidos .\n");/* imprime mensagem */
                    for(j=0;j<tam_struct;j++)
                        if(usuario[j].codigo[0] == atoi(cod)){               /* atoi converte string para inteiro */
                            printf("Esse codigo ja existe , insira outro .\n");
                            flag=1;
                            break;
                        }
                }while( flag );                             /* se flag verdaeiro repete para pegar um codigo valido */
                usuario[tam_struct].codigo[0] = atoi(cod);  /* coloca o codigo valido na struct                     */
                printf("nome usuario ");
                fflush(stdin);                    /* limpa o buffer do teclado para não pegar sujeira que esteja lá */
                scanf("%s", usuario[tam_struct].nome);      /* pega o nome do usuario                               */
                printf("sobrenome usuario ");
                fflush(stdin);
                scanf("%s", usuario[tam_struct].sobrenome); /* pega o sobrenome do usuario                          */
                printf("cargo usuario ");
                fflush(stdin);
                scanf("%s", usuario[tam_struct].cargo);     /* pega o cargo do usuario                              */
                tam_struct++;
                printf("Quer inserir outro usuario   S/N ");
                printf("\n\n");
                op=getche();
            }while(toupper(op) != 'N');
            break;
        case 4 :
            flag=0;
            printf("\nNome usuario excluir ");
            scanf("%s",cod);
            for(j=0;j<tam_struct;j++){
                if(strcmp(usuario[j].nome,cod)==0){
                    imprime(j);
                    printf("Quer mesmo excluir S/N ");
                    op = getche();
                    if(toupper(op) == 'S'){
                        for(w=j;w<tam_struct;w++){
                            usuario[w] = usuario[w+1];
                        }
                        flag=1;
                        tam_struct--;
                        break;
                    }
                    else break;
                }
            }
            if( flag )
                printf("\nUsuario excluido com sucesso !\n     Tecle ");
            else
                printf("\nOk , Usuario nao foi excluido !\n     Tecle ");
            getch();
            break;
        case 5 :
            flag=0;
            printf("Alerando hum usuario \n\n");
            printf("\nNome usuario alterar ");
            scanf("%s",cod);
            for(w=0;w<tam_struct;w++){
                if(strcmp(usuario[w].nome,cod)==0){
                    imprime(w);
                    printf("\nQuer mesmo alterar S/N ");
                    op = getche();
                    if(toupper(op) == 'S'){
                        do{
                            printf("\ncodigo usuario ");
                            fflush(stdin);              /* limpa o buffer do teclado para não pegar sujeira que esteja lá */
                            scanf("%s", cod );          /* pega o codigo do usuario em uma string                         */
                            flag=0;                     /* flag igual falso                                               */
                            for(j=0;j<strlen(cod);j++)  /* percorre todos os caracteres da string                         */
                                if( ! isdigit(cod[j]))  /* se algum caractere não for um digito de zero a nove            */
                                    flag=1;             /* flag igual verdadeiro                                          */
                            if( flag )                  /* se flag verdaeiro                                              */
                                printf("O codigo precisa ser só numeros , e nesse tem caracteres invalidos .\n");/* imprime mensagem */
                            for(j=0;j<tam_struct;j++)
                                if(usuario[j].codigo[0] == atoi(cod)){               /* atoi converte string para inteiro */
                                    printf("Esse codigo ja existe , insira outro .\n");
                                    flag=1;
                                    break;
                                }
                        }while( flag );                             /* se flag verdaeiro repete para pegar um codigo valido */
                        usuario[w].codigo[0] = atoi(cod);  /* coloca o codigo valido na struct                     */
                        printf("nome usuario ");
                        fflush(stdin);                    /* limpa o buffer do teclado para não pegar sujeira que esteja lá */
                        scanf("%s", usuario[w].nome);      /* pega o nome do usuario                               */
                        printf("sobrenome usuario ");
                        fflush(stdin);
                        scanf("%s", usuario[w].sobrenome); /* pega o sobrenome do usuario                          */
                        printf("cargo usuario ");
                        fflush(stdin);
                        scanf("%s", usuario[w].cargo);     /* pega o cargo do usuario                              */
                        printf("Usuario alterado com sucesso !\n      Tecle ");
                        flag=1;
                        break;
                    }
                }
            }
            if( ! flag )
                printf("\nOk , Usuario nao foi aletrado !\n     Tecle ");
            getch();
            break;
        default :
            if(opc!=6){
                printf("Opcao invalida !\n     Tecle ");
                getch();
            }
        }
    }while(opc!= 6 );
    arq=fopen("arquivo_de_dados.txt","w");      /* abre o arquivo e reseta ele para gravar dese o inicio do arquivo */
    for(j=0;j<tam_struct;j++){
        fprintf(arq, "%d " , usuario[j].codigo[0]);  /* grava no arquivo txt */
        fprintf(arq, "%s " , usuario[j].nome     );  /* grava no arquivo txt */
        fprintf(arq, "%s " , usuario[j].sobrenome);  /* grava no arquivo txt */
        fprintf(arq, "%s " , usuario[j].cargo    );  /* grava no arquivo txt */
    }
    fclose(arq);

    for(j=0;j<10;j++){
        gotoxy(0,23);
        printf("Ok , Vamos fechar o programa ");
        for(w=0;w<8;w++){
            gotoxy(j*2+29,23);
            printf("%c",carac[w]);
            Sleep(70);
        }
        gotoxy(j*2+29,23);
        printf(".");
        if(j==9)printf(" !");
        printf("   %d",9-j);
        gotoxy(79,23);
        Sleep(50);
    }
    gotoxy(53,23);
    printf(" \n\n");
    textcolor(0,15);
    return 0;
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×