Ir ao conteúdo
  • Cadastre-se

C Passar os numero inteiros de arquivo .txt e colocar em um struct.


Lucas Bispo 150

Posts recomendados

Bom dia, sou estudante pode ser que não fiz um código estão bonito, mas  gostaria de ajuda referente a passar uma linha de números inteiros dento de um arquivo de txt (teste.txt) para um struct.

Exemplo de entrada de dados que esta no arquivo. Onde cada numero deve corresponder a uma variável de tipo inteiro dentro de uma struct onde deve ser encadeada uma lista para cada struct preenchida.

linha 1-> 0 ; 30000.00 ; 60 ; 4 
linha 2 -> 0 ; 30000.00 ; 60 ; 4 
linha 3 -> 2 ; 70000.00 ; 70 ; 5 

Bom eu consigo imprimir os valores separadamente como inteiro mas não consigo jogar na struct, para então direcionar os ponteiros fazendo assim uma lista encadeada e logo apos estará pronta para uso através do menu

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

typedef struct st_no{
  int num;
  struct st_no *prox;
}NO;

NO *criar_no(){
  NO *novo = (NO*)malloc(sizeof(NO));
  return novo;
}

NO *inserir_Inicio(NO *lista,int valor){

  NO *novo_no = criar_no();

  novo_no->num = valor;

  if (lista == NULL){
    lista = novo_no;
    novo_no->prox = NULL;
  }
  else{
    novo_no->prox = lista;
    lista = novo_no;
  }
  return lista;
}


NO *inserir_fim(NO *lista,int dado){

  NO *no = (NO*)malloc(sizeof(NO));
  no->num = dado;
  
  if(lista == NULL){
    no->prox = NULL;
    lista = no; 
    }
  else{
    NO *aux = lista;
      
    while (aux->prox != NULL){
    aux = aux->prox;
    } 
      
    no->prox = NULL;
    aux->prox = no;
   
  }
  
  return lista;
}

NO *busca(NO *lista, int valor){

  NO *aux = lista;

  while(aux->prox != NULL){ 
    
    if(aux->num == valor){
      
      return aux;      
      
    }
  
  aux = aux->prox;
  
  }
}

NO *deletar(NO *lista,int valor){
  NO *anterior,*proximo;
  proximo = lista->prox;
  anterior = lista;
  
  if (anterior->num == valor){
    lista = proximo;
    
    printf("Valor apagado pois se encontra no inicio da lista.\n");
    free(anterior);
  }

  while (proximo != NULL){
    if(proximo->num == valor){

      anterior->prox = proximo->prox;
      printf("Valor deletado\n");
      free(proximo);

      }

      anterior = proximo;
      proximo = proximo->prox;
    }
    return lista;

}

void imprimir_Lista(NO *lista){
  NO *aux;
  
  for (aux = lista; aux != NULL; aux = aux->prox){
    printf("|%d|->",aux->num);
  }
  printf("\n");
}

void linhaAlinha(NO *li){
  
  FILE *arq;
  int sLp2;
  int contador = 1;

  char nome[40], *resultado;

  arq = fopen("teste.txt", "r");

  if(arq){

    while(!feof(arq)){

      resultado = fgets(nome, 40, arq);
      
      if(resultado){
        printf( " \n ");
        printf("%s", nome);
        printf( " \n");

        const char s[2] = ";";
        char *token;
   
        /* get the first token */
        token = strtok(nome, s);
   
        /* walk through other tokens */
        while( token != NULL ) {
          //printf( " %s\n", token );
            

          sLp2 = atoi(token);
            

          printf( " \n ");
          printf( " %d ", sLp2 );
          printf( " \n ");

          token = strtok(NULL, s);
        } 
      }
    }
  }

}





int main() {
  int escolha,valor;
  NO *respostaBusca;
    
  NO *lista = NULL;

  linhaAlinha(lista);
    
  do{
    printf("[1]-Inserir elemento\n[2]-Inserir no fim\n[3]-Busca de elementos\n[4]-Deletar elementos\n[5]-Imprimir lista\n[-1]-sair\n");
    scanf("%d",&escolha);

    switch (escolha){

      case 1:{
       printf("Digite o valor a colocar na lisrta:");
       scanf("%d",&valor);

       lista = inserir_Inicio(lista,valor);
        break;
      }

      case 2:{
        printf("Digite o valor a colocar na lisrta:");
        scanf("%d",&valor);
        lista = inserir_fim(lista,valor);
        break;
      }
            
      case 3:{
        printf("Digite o valor para buscar:");
        scanf("%d",&valor);
        respostaBusca = busca(lista,valor);
        printf("Valor encontrado %d\n",respostaBusca->num);
        break;
      }
      
      case 4:{
        printf("Digite o valor para deletar:");
        scanf("%d",&valor);
        lista = deletar(lista,valor);
        break;
      }
      
      case 5:{
        imprimir_Lista(lista);
				break;
			}

      case -1:
        free(lista);
        default:
        break;
    }

  }while (escolha != -1);

  return 0;
}

 

testetxt.png

  • Amei 1
Link para o comentário
Compartilhar em outros sites

@Lucas Bispo 150    passar do Arquivo para a Struct  , você pega no arquivo logo no início do programa ,  e usando fscanf é mais fácil que fgets ,  pois ele pegar um número de cada vez , e o fgets pega uma linha inteira até o NewLine ,  e aí você precisa ir desmembrando os dados dessa Linha , e creio que isso se torna  difícil , e outra coisa é que é melhor colocar as funções depois da função principal que é a main , e seu código com algumas modificações poderia ser assim  :

#include  <stdio.h>
#include  <ctype.h>
#include  <windows.h>
#include  <stdlib.h>
#include  <string.h>
#define barra printf("*****************************************\n");
#define cls system("cls");
typedef struct st_no{
  int num;
  struct st_no *prox;
}NO;
               NO no[100];
NO *criar_no();
int carac2[77] =
{
  124 , 130 , 130 , 126 ,   2 , 130 , 124 , /* Digito 9    */ // 01111100 --|
  124 , 130 , 124 , 130 , 130 , 130 , 124 , /* Digito 8    */ // 10000010   |
  254 ,   2 ,  12 ,  16 ,  96 ,  64 ,  64 , /* Digito 7    */ // 10000010   |
  124 , 128 , 188 , 194 , 130 , 130 , 124 , /* Digito 6    */ // 01111110   |-- Digito Nove
  252 , 128 , 252 ,   2 ,   2 , 130 , 124 , /* Digito 5    */ // 00000010   |
   28 ,  36 ,  68 , 132 , 252 ,   4 ,  62 , /* Digito 4    */ // 10000010   |
  124 , 130 ,   2 ,  28 ,   2 , 130 , 124 , /* Digito 3    */ // 01111100 --|
  124 , 130 ,   2 ,  28 ,  96 , 128 , 252 , /* Digito 2    */
   16 , 112 ,  16 ,  16 ,  16 ,  16 , 124 , /* Digito 1    */
   56 ,  68 , 138 , 146 , 162 ,  68 ,  56 , /* Digito 0    */
    0 ,   0 ,   0 ,   0 ,   0 ,   0 ,   0   /* Digito nada */
};
int cont;  // é um contador de quantidade de números no arquivo
NO *inserir_Inicio(NO *lista,int valor);
NO *inserir_fim(NO *lista,int dado);
NO *criar_no();
NO *busca(NO *lista, int valor);NO *deletar(NO *lista,int valor);
void imprimir_Lista(NO *lista);
void linhaAlinha(NO *li);
void pega_do_arquivo();
void imprimir_da_struct();
void saindo();
void gotoxy_2(int,int);
void desenha(int,int,int *caract,int,int);
void getch();
//-----****************  FUNÇÃO PRINCIPAL   ***********--------------
int main()
{
  int escolha,valor,
      _i_;
  char escolh[40];
  NO *respostaBusca;
  NO *lista = NULL;

  pega_do_arquivo();
  imprimir_da_struct();

  linhaAlinha(lista);
  cls
  do
  {
    printf("   Menu De opções :\n");
    barra
    printf(" [ 0 ] - sair              \n");
    printf(" [ 1 ] - Inserir elemento  \n");
    printf(" [ 2 ] - Inserir no fim    \n");
    printf(" [ 3 ] - Busca de elementos\n");
    printf(" [ 4 ] - Deletar elementos \n");
    printf(" [ 5 ] - Imprimir lista    \n");
    barra
    printf("         Escolha Uma Opcao   ");
    Label_1:
    scanf("%s",escolh                     );
    for(_i_=0; escolh[_i_] !='\0'; _i_++   )
    if( ! isdigit(escolh[_i_]))goto Label_1;
    escolha = atoi(escolh);
    switch ( escolha )
    {
    case 1:
       printf("Digite o valor a colocar na lisrta:");
       scanf("%d",&valor);
       lista = inserir_Inicio(lista,valor);
        break;
    case 2:
        printf("Digite o valor a colocar na lisrta:");
        scanf("%d",&valor);
        lista = inserir_fim(lista,valor);
        break;
    case 3:
        printf("Digite o valor para buscar:");
        scanf("%d",&valor);
        respostaBusca = busca(lista,valor);
        printf("Valor encontrado %d\n",respostaBusca->num);
        break;
    case 4:
        printf("Digite o valor para deletar:");
        scanf("%d",&valor);
        lista = deletar(lista,valor);
        break;
    case 5:
        imprimir_Lista(lista);
        break;
    case 0:
        free(lista);
        break;
    default:
        printf("Esse Numero Nao Faz Parte Das opções\n\n");
    }
  }while ( escolha );
  saindo();
  return 32768;
}
NO *inserir_Inicio(NO *lista,int valor){

  NO *novo_no = criar_no();

  novo_no->num = valor;

  if (lista == NULL){
    lista = novo_no;
    novo_no->prox = NULL;
  }
  else{
    novo_no->prox = lista;
    lista = novo_no;
  }
  return lista;
}

NO *inserir_fim(NO *lista,int dado){

  NO *no = (NO*)malloc(sizeof(NO));
  no->num = dado;

  if(lista == NULL){
    no->prox = NULL;
    lista = no;
    }
  else{
    NO *aux = lista;

    while (aux->prox != NULL){
    aux = aux->prox;
    }

    no->prox = NULL;
    aux->prox = no;

  }

  return lista;
}
NO *criar_no()
{
  NO *novo = (NO*)malloc(sizeof(NO));
  return novo;
}

NO *busca(NO *lista, int valor){

  NO *aux = lista;

  while(aux->prox != NULL){

    if(aux->num == valor){

      return aux;

    }

  aux = aux->prox;

  }
}

NO *deletar(NO *lista,int valor){
  NO *anterior,*proximo;
  proximo = lista->prox;
  anterior = lista;

  if (anterior->num == valor){
    lista = proximo;

    printf("Valor apagado pois se encontra no inicio da lista.\n");
    free(anterior);
  }

  while (proximo != NULL){
    if(proximo->num == valor){

      anterior->prox = proximo->prox;
      printf("Valor deletado\n");
      free(proximo);

      }

      anterior = proximo;
      proximo = proximo->prox;
    }
    return lista;

}

void imprimir_Lista(NO *lista){
  NO *aux;

  for (aux = lista; aux != NULL; aux = aux->prox){
    printf("|%d|->",aux->num);
  }
  printf("\n");
}

void linhaAlinha(NO *li){

  FILE *arq;
  int sLp2;
  int contador = 1;

  char nome[40], *resultado;

  arq = fopen("teste.txt", "r");

  if(arq){

    while( !  feof( arq ) )
    {
      resultado = fgets(nome, 40, arq);
      if(resultado){
        printf("\nNome = %s", nome);
        printf( " \n");

        const char s[2] = ";";
        char *token;

        /* get the first token */
        token = strtok(nome, s);

        /* walk through other tokens */
        while( token != NULL ) {
          //printf( " %s\n", token );


          sLp2 = atoi(token);


          printf( " \n ");
          printf( " %d ", sLp2 );
          printf( " \n ");

          token = strtok(NULL, s);
        }
      }
    }
  }

}

void pega_do_arquivo()
{
    FILE *a;
    int p;
    a = fopen("teste_18.txt","rt");
    if(a == NULL)
        printf("Erro . . . ! ! !  ,  Esse Arquivo   \
               <  teste_18.txt  >   Nao Existe !\n");
    printf("    pegando do Arquivo TXT\n");
    barra
    while( fscanf( a, "%d", &no[cont].num ) != EOF )
    {
        //no[cont].num = p;
        printf("%3d Numero no Arquivo ==> %3d\n",cont+1,no[cont].num);
        cont++;
    }
    fclose( a );
    barra
}
void imprimir_da_struct()
{
    int _i_;
    printf("\n\nEscrevendo Os Valores Guardados Na Struct\n");
    barra
    for( _i_=0; _i_<cont; _i_++ )
        printf("%3d Numero Que esta Na Struct -> %3d\n",_i_+1,no[_i_].num);
    barra
    printf("    Tecle . . . !   ");
    getch();
}
void saindo()
{
    int w,px,py,x,j;                          /* variáveis simples                               */
    HANDLE hOut;                              /* controle dos dispositivos do pc                 */
    HBITMAP hb;
    long lg;
    hOut= GetStdHandle(STD_OUTPUT_HANDLE);    /* pega a saída padrão                              */
    CONSOLE_SCREEN_BUFFER_INFO SBInfo;        /* informações sobre a buffer da tela               */
    GetConsoleScreenBufferInfo(hOut, &SBInfo);/* pega a posição do cursor do console              */
    GetBitmapBits(hb,lg,NULL);
    px = SBInfo.dwCursorPosition.X;           /* pX será a posição da coluna do cursor no console */
    py = SBInfo.dwCursorPosition.Y + 6;       /* pY será a posição da linha do cursor no console  */
    gotoxy_2(0,py+20);
    gotoxy_2(0,py   );
    for( j=0; j<11; j++ )
        desenha(60,py,carac2,j,j);  /* são os dígitos   */
    printf("\n\n\n\n");
}
void desenha(int co_i, int li_i, int caract[],int w,int h){
    int x,y,q,co,li;
    li=li_i;
    w *= 7;
    for(x=0;x<7;x++){                  /* linhas */
        co=co_i;
        q=caract[x+w];
        for(y=0;y<16;y += 2){              /* colunas */
            gotoxy_2(co,li);
            if(q % 2==0)printf("  ");
            else   printf("%c%c",219,219);
            co -= 2;
            q/=2;
        }
        li++;
    }
    gotoxy_2(70,li_i+7);
    if(h<9)Sleep(400);
}
void gotoxy_2(int coluna, int linha){/*imprimir na linha e coluna desejada */
  SetConsoleCursorPosition( GetStdHandle(STD_OUTPUT_HANDLE),(COORD){coluna,linha});
}
void	getch()
{
  FlushConsoleInputBuffer(GetStdHandle(STD_INPUT_HANDLE));
  WaitForSingleObject(GetStdHandle(STD_INPUT_HANDLE), INFINITE);
};

 

Link para o comentário
Compartilhar em outros sites

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