Ir ao conteúdo

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


Ir à solução Resolvido por devair1010,

Posts recomendados

Postado

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
Postado

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
Postado

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

  • Obrigado 1
Postado

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
Postado

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

Postado

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
  • Solução
Postado

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

 

Crie uma conta ou entre para comentar

Você precisa ser um usuário 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 comunidades 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

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!