Ir ao conteúdo

C Realocar arquivos do .txt ao abrir o programa em c


Ir à solução Resolvido por devair1010,

Posts recomendados

Postado

Estou com um problema em estrutura de dados e gostaria que alguém me ajudasse uma dificuldade que não estou conseguindo resolver.

Meu programa, eu consigo cadastrar, consultar, salvar e exclui, tudo isso feito alocado em memória.

eu só utilizo o arquivo .txt para salvar.

Tudo isso esta funcionando no meu código , exceto quando eu abro o programa, ele precisa já realocar os arquivos que estão salvo no txt para mim poder alterar, excluir ou consultar nele, mas todas essas modificações é feito em memória e depois eu salvo subscrevendo o txt.

 

O cadastro é da seguinte forma:

tenho uma variável nome que pega o nome que o usuário digitar

exemplo: arthur

e uma que o usuário digita o sobrenome:

exemplo: Oliver

e quando eu pesquiso pelo nome ele me trás o nome e o sobrenome separado por um "-"

exemplo: arthur-oliver

e dentro do txt tem vários nomes e sobrenomes salvo desse modelo, um em baixo do outro:

exemplo:

arthur-oliver1

arthur-oliver2

arthur-oliver3

 

Eu preciso que quando abrir o programa automaticamente ele já realoca esses cadastros para mim conseguir excluir ou alterar o nome ou o sobrenome.

Alguém consegue me ajudar como posso fazer ? estou fazendo em C.

o nome do meu txt é "nome.txt". e as informações estão alocadas em um vetor chamado cadastro.

 

  • Obrigado 1
Postado

@arthur Oliver 19     se você estiver usando struct ,  então você abre o arquivo para leitura e usa o fscanf para ler no arquivo e separa o nome do sobrenome e coloca na struct nas variável nome  e sobrenome , isso no início do programa .com isso os dados estarão na memória e você poderá trabalhar com eles .  se você puder poste seu código para vermos melhor como ajudar  .

Postado

Como é código do trabalho da faculdade, fico com receio de postar e depois da plágio.

mas como posso fazer essa separação do nome e o do sobrenome ?

acredito que de para usar o "-" para separar e armazenar as duas strings em cada variável.

  • Obrigado 1
Postado

@arthur Oliver 19      separa da seguinte forma , o scanf vai pegar todos os caracteres que estiverem juntos e colocar em uma variável do tipo string ou char com muitas posições , e então você usa um loop for  começando de zero e indo até enquanto for menor que o tamanho da string , e para isso use o comando strlen , e dentro do loop você verifica se o caractere nessa posição da string é igual ao sinal de menos " - " , se não for então coloque esse caractere em outra string , e assim até que encontre aquele sinal , aí não coloca esse caractere na string auxiliar pois significa que pegou o nome , depois vai pegando os outros caracteres restantes colocando em mais outra variável string até encontrar um caractere que seja um digito numérico , então não coloque esse caractere pois significa que já pegou o sobrenome , aí termina o loop com o comando break , e em seguida coloca esse nome e sobrenome  na struct na variável referente  .

Postado
int slot;
FILE *ARQUIVOS;
ARQUIVOS = fopen("Nomes.txt", "r");


if(ARQUIVOS == NULL)
{
	printf("\n\n\nNao foi possivel abrir o arquivo. \n\n\n");
	Sleep(700);
	getchar();
	exit (0);
}
  
  system("cls");
       printf("  ");printf("\t\t\t   PALAVRAS CADASTRADA NO BANCO    ");printf("\t\t \n");
       printf("    %c**********************************************************%c\n",200,188);
       
    Sleep(700);
    
    
  char palavra[200];
  
  while(fgets(palavra,200,ARQUIVOS ) != NULL){	
  slot++;  
  	
	 printf("%s", palavra);
  }
  
	
}

Eu criei uma função desse jeito, ao chamar ele exibi todos os nomes que esta dentro do txt.

mas não fica alocado, só exibi as informações do txt.
 
  Tem como utilizar exemplo com código dessas dicas que vou me deu ?
 
  vi que a função strtok é uma função delimitadora, consigo armazenar o nome que vem antes do "-" em uma variável e o sobrenome que vem depois do "-" em outra variável ?

  • Amei 1
  • Solução
Postado

@arthur Oliver 19       seu código está bom ,   só precisa fazer a parte de inserir na struct ,  então seu código com algumas modificações poderia ser assim   :

#include <stdio.h>
#include <conio.h>
#include <windows.h>
int slot,cont,j,i,k;                        /* variáveis globais                                           */
struct registro{                            /* a struct                                                    */
    char nome[30];                          /* os campos da struct                                         */
    char sobrenome[30];
}reg[10];                                   /* o vetor da struct                                           */
FILE *ARQUIVOS;                             /* ponteiro para arquivo                                       */
char separa_nome(char *res){                /* ponteiro aponta para endereço da variável enviada           */
    for(j=0;j<strlen(res);j++){             /* percorrer a variável do começo ao fim                       */
        if(res[j]=='-'){                    /* se encontar o sinal de menos                                */
            res[j]='\0';                    /* coloca o sinal de fim de string                             */
            break;                          /* sai do loop pois já pegou o nome toda                       */
        }
    }
}
char separa_sobrenome(char *res){           /* ponteiro aponta para endereço da variável enviada           */
    for(j=0;j<strlen(res);j++){             /* percorrer a variável do começo ao fim                       */
        if(res[j]=='-'){                    /* se encontrar o sinal de menos                               */
            k=-1;                           /* posiciona o contador uma posição antes                      */
            for(i=j+1;res[i]!='\0';i++){    /* percorrer a variável até encontrar o sinal do fim da string */
                k++;                        /* incrementa a posição                                        */
                if((int)res[i]>47 && (int)res[i]<58 )break;/* se o caractere for um digite de zero até nove*/
                                             /* sai desse loop pois já pegou o sobrenome                    */
                res[k]=res[i];               /* coloca o caractere na posição certa                         */
            }
            res[k]='\0';                     /* coloca o finalizador da string                              */
            break;
        }
    }
}
int main(){
    ARQUIVOS = fopen("Nomes.txt", "r");      /* abre o arquivo                                              */
    if(ARQUIVOS == NULL){                    /* se o arquivo não existir                                    */
        printf("\n\n\nNao foi possivel abrir o arquivo. \n\n\n");
        Sleep(700);                          /* dorme hum pouquinho                                         */
        /*getchar();*/
        exit (0);                            /* sai do programa                                             */
    }
    system("cls");                           /* limpa a tela                                                */
    printf("  ");printf("\t\t\t   PALAVRAS CADASTRADA NO BANCO    ");printf("\t\t \n");
    printf("    %c**********************************************************%c\n",200,188);

    Sleep(700);                              /* dorme hum pouquinho                                         */
    char palavra[200],aux[20];               /* variáveis locais                                            */

    while(fscanf(ARQUIVOS,"%s",palavra) != EOF){/* lê caract juntos até encontrar o fim do arquivo EOF      */
        slot++;
        printf("A Palavra ---------------------> %s\n\n", palavra);
        strcpy(aux,palavra);
        separa_nome(&aux);                   /* envia o endereço na memória da variável palavra             */
        strcpy(reg[cont].nome,aux);
        printf("o nome gravado na struct ------> %s\n",reg[cont].nome);

        separa_sobrenome(&palavra);          /* envia o endereço na memória da variável palavra             */
        strcpy(reg[cont].sobrenome,palavra);
        printf("o sobrenome gravado na struct -> %s\n",reg[cont].sobrenome);
        printf("=================================================================\n\n");
        cont++;
    }
    fclose(ARQUIVOS);
    for(j=0;j<cont;j++){
        printf("Nome e sobreNome --> %s " ,reg[j].nome     );
        printf(                     "%s\n",reg[j].sobrenome);
    }
    getch();
}

na saída o cont terá determinado valor que será usado para continuar inserir dados na struct a partir dessa posição , e nesse código  insere string , mas se quiser inserir números basta converter a string para int usando a função  atoi  , e inserir na struct no campo int .

  • Curtir 1
Postado

@devair1010  show de bola cara, assim funcionou, só teve um pequeno problema, ele não esta pegando o ultimo Caractere

do sobrenome.

 

exemplo:

 

Registrei arthur-oliver

ele armazenou no nome: arthur e no sobrenome: olive , não pegou o "r".

 

 

adicionado 44 minutos depois
char separa_sobrenome(char *res){
    for(j=0;j<strlen(res);j++){
        if(res[j]=='-'){
            k=-1;
            for(i=j+1;res[i]+1!='\0';i++){
                k++;
                if((int)res[i]>47 && (int)res[i]<58 )
                break;
                res[k]=res[i];
            }
            res[k]='\0';
            break;
        }
    }
}

Consegui fazer pegar todos os caracteres adicionando +1 no segundo For da função: Separa_sobrenome.

Muito obrigado Devair

  • Obrigado 1

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

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!