Ir ao conteúdo

Armazenar conteúdo textual em estruturas


Wookie69

Posts recomendados

Postado

#Coloque sempre o código dentro dos spoiler

#Poste apenas a sua dúvida e não o seu código inteiro, de ímpeto

Boa noite a todos,

Tenho um trablaho de facu em C, só que não conseguí fazer de jeito nenhum, abaixo está um pedaço do código, onde está o `//implemente aqui` devemos colocar o código, só que não conseguí entender esse negócio de structs dentro de structs com ponteiros.

A ideia do trabalho é ler um arquivo que tem dados de patrimonio da empresa, como o computador e para cada computador, as informações do hardware do mesmo, bem como os programas instalados (sistema operacional e aplicativos) e a parte de logística. Devemos ler um arquivo com essas informações armazenando nessas estruturas em memória e depois listar as mesma.

A estrutura para imprimir já esta feita, falta conseguir encaixar a montagem das listas encadeadas em memória para armazenar e listar depois.

Se alguém puder me ajudar agradeço desde já, visto que já estou a vários dias em cima desse problema e não conseguí resolver.

Abaixo segue o código do mesmo :

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#define TAM_STRING 30

FILE *entrada;

typedef struct

{

int dia;

int mes;

int ano;

} data;

typedef struct opcionais_hardware

{

char nome[TAM_STRING];

char descricao[TAM_STRING*2];

struct opcionais_hardware *proximo;

} opcionais_hardware;

typedef struct aplicativos

{

char nome[TAM_STRING];

char versao[TAM_STRING/2];

data data_instalacao;

struct aplicativos *proximo;

} aplicativos;

typedef struct

{

char fabricante[TAM_STRING/2];

char modelo[TAM_STRING/2];

float clock;

} processador;

typedef struct

{

processador cpu;

int memória;

int HD;

opcionais_hardware *op_hw;

} hardware;

typedef struct

{

char nome[TAM_STRING];

char versao[TAM_STRING/2];

data data_instalacao;

char senha[TAM_STRING];

} sistema_operacional;

typedef struct

{

sistema_operacional so;

aplicativos *app;

} software;

typedef struct

{

char setor[TAM_STRING];

char responsavel[TAM_STRING];

int patrimonio;

} logistica;

typedef struct computador

{

hardware hw;

software sw;

logistica logt;

} computador;

typedef struct no_computador

{

computador *pc;

struct no_computador *proximo;

} no_computador;

typedef struct lista

{

no_computador *inicio;

no_computador *fim;

} lista;

char *lerCampo(char op)

{

char *temp=(char *)malloc(sizeof(char)*TAM_STRING);

char ch;

int cont=0;

while((ch=getc(entrada))!=op)

{

if (ch!=EOF)

temp[cont++]=ch;

else if (ch!=EOF)

exit(0);

}

temp[cont]='�';

return temp;

}

lista *lerArquivo(char endereco[])

{

lista *l=NULL;

entrada=fopen(endereco,"r");

char ch;

char *temp=(char *)malloc(sizeof(char)*TAM_STRING);

int estado=-1;

while((ch=getc(entrada))!=EOF)

{

if (ch=='<')

temp=lerCampo('>');

if (ch!=' ' && ch!='n' && ch!='t')

{

if (strcmp(temp,"computador")==0 && estado==-1)

{

estado=0;

//implemente aqui

}

else if (strcmp(temp,"hardware")==0 && estado==0)

{

estado=1;

}

else if (strcmp(temp,"processador")==0 && estado==1)

{

estado=11;

}

else if (strcmp(temp,"fabricante")==0 && estado==11)

{

estado=111;

strcpy(l->fim->pc->hw.cpu.fabricante,lerCampo('<'));

fseek(entrada,-1,SEEK_CUR);

}

else if (strcmp(temp,"modelo")==0 && estado==11)

{

estado=112;

strcpy(l->fim->pc->hw.cpu.modelo,lerCampo('<'));

fseek(entrada,-1,SEEK_CUR);

}

else if (strcmp(temp,"clock")==0 && estado==11)

{

estado=113;

l->fim->pc->hw.cpu.clock=atof(lerCampo('<'));

fseek(entrada,-1,SEEK_CUR);

}

else if (strcmp(temp,"memória")==0 && estado==1)

{

estado=12;

l->fim->pc->hw.memória=atoi(lerCampo('<'));

fseek(entrada,-1,SEEK_CUR);

}

else if (strcmp(temp,"HD")==0 && estado==1)

{

estado=13;

l->fim->pc->hw.HD=atoi(lerCampo('<'));

fseek(entrada,-1,SEEK_CUR);

}

else if (strcmp(temp,"opcionais_hardware")==0 && estado==1)

{

estado=14;

//implemente aqui

}

else if (strcmp(temp,"nome")==0 && (estado==14 || estado==21 || estado==22))

{

if (estado==14)

{

estado=141;

//implemente aqui

fseek(entrada,-1,SEEK_CUR);

}

else if (estado==21)

{

estado=211;

strcpy(l->fim->pc->sw.so.nome,lerCampo('<'));

fseek(entrada,-1,SEEK_CUR);

}

else

{

estado=221;

//implemente aqui

fseek(entrada,-1,SEEK_CUR);

}

}

else if (strcmp(temp,"descricao")==0 && estado==14)

{

estado=142;

//implemente aqui

fseek(entrada,-1,SEEK_CUR);

}

else if (strcmp(temp,"software")==0 && estado==0)

{

estado=2;

}

else if (strcmp(temp,"sistema_operacional")==0 && estado==2)

{

estado=21;

}

else if (strcmp(temp,"versao")==0 && (estado==21 || estado==22))

{

if (estado==21)

{

estado=212;

strcpy(l->fim->pc->sw.so.versao,lerCampo('<'));

fseek(entrada,-1,SEEK_CUR);

}

else

{

estado=222;

//implemente aqui

fseek(entrada,-1,SEEK_CUR);

}

}

else if (strcmp(temp,"data_instalacao")==0 && (estado==21 || estado==22))

{

if (estado==21)

estado=213;

else

estado=223;

}

else if (strcmp(temp,"dia")==0 && (estado==213 || estado==223))

{

if (estado==213)

{

estado=2131;

l->fim->pc->sw.so.data_instalacao.dia=atoi(lerCampo('<'));

fseek(entrada,-1,SEEK_CUR);

}

else

{

estado=2231;

//implemente aqui

fseek(entrada,-1,SEEK_CUR);

}

}

else if (strcmp(temp,"mes")==0 && (estado==213 || estado==223))

{

if (estado==213)

{

estado=2132;

l->fim->pc->sw.so.data_instalacao.mes=atoi(lerCampo('<'));

fseek(entrada,-1,SEEK_CUR);

}

else

{

estado=2232;

//implemente aqui

fseek(entrada,-1,SEEK_CUR);

}

}

else if (strcmp(temp,"ano")==0 && (estado==213 || estado==223))

{

if (estado==213)

{

estado=2133;

l->fim->pc->sw.so.data_instalacao.ano=atoi(lerCampo('<'));

fseek(entrada,-1,SEEK_CUR);

}

else

{

estado=2233;

//implemente aqui

fseek(entrada,-1,SEEK_CUR);

}

}

else if (strcmp(temp,"senha")==0 && estado==21)

{

if (estado==21)

{

estado=214;

strcpy(l->fim->pc->sw.so.senha,lerCampo('<'));

fseek(entrada,-1,SEEK_CUR);

}

}

else if (strcmp(temp,"aplicativos")==0 && estado==2)

{

estado=22;

//implemente aqui

}

else if (strcmp(temp,"logistica")==0 && estado==0)

{

estado=3;

}

else if (strcmp(temp,"setor")==0 && estado==3)

{

estado=31;

strcpy(l->fim->pc->logt.setor,lerCampo('<'));

fseek(entrada,-1,SEEK_CUR);

}

else if (strcmp(temp,"responsavel")==0 && estado==3)

{

estado=32;

strcpy(l->fim->pc->logt.responsavel,lerCampo('<'));

fseek(entrada,-1,SEEK_CUR);

}

else if (strcmp(temp,"patrimonio")==0 && estado==3)

{

estado=33;

l->fim->pc->logt.patrimonio=atoi(lerCampo('<'));

fseek(entrada,-1,SEEK_CUR);

}

if (strcmp(temp,"/computador")==0)

{

if (estado==0)

estado=-1;

else

exit(0);

}

else if (strcmp(temp,"/hardware")==0)

{

if (estado==1)

estado=0;

else

exit(0);

}

else if (strcmp(temp,"/processador")==0)

{

if (estado==11)

estado=1;

else

exit(0);

}

else if (strcmp(temp,"/fabricante")==0)

{

if (estado==111)

estado=11;

else

exit(0);

}

else if (strcmp(temp,"/modelo")==0)

{

if (estado==112)

estado=11;

else

exit(0);

}

else if (strcmp(temp,"/clock")==0)

{

if (estado==113)

estado=11;

else

exit(0);

}

else if (strcmp(temp,"/memória")==0)

{

if (estado==12)

estado=1;

else

exit(0);

}

else if (strcmp(temp,"/HD")==0)

{

if (estado==13)

estado=1;

else

exit(0);

}

else if (strcmp(temp,"/opcionais_hardware")==0)

{

if (estado==14)

estado=1;

else

exit(0);

}

else if (strcmp(temp,"/nome")==0)

{

if (estado==141)

estado=14;

else if (estado==211)

estado=21;

else if (estado==221)

estado=22;

}

else if (strcmp(temp,"/descricao")==0)

{

if (estado==142)

estado=14;

}

else if (strcmp(temp,"/software")==0)

{

if (estado==2)

estado=0;

else

exit(0);

}

else if (strcmp(temp,"/sistema_operacional")==0)

{

if (estado==21)

estado=2;

else

exit(0);

}

else if (strcmp(temp,"/versao")==0)

{

if (estado==212)

estado=21;

else if (estado==222)

estado=22;

}

else if (strcmp(temp,"/data_instalacao")==0)

{

if (estado==213)

estado=21;

else if (estado==223)

estado=22;

}

else if (strcmp(temp,"/dia")==0)

{

if (estado==2131)

estado=213;

else if (estado==2231)

estado=223;

}

else if (strcmp(temp,"/mes")==0)

{

if (estado==2132)

estado=213;

else if (estado==2232)

estado=223;

}

else if (strcmp(temp,"/ano")==0)

{

if (estado==2133)

estado=213;

else if (estado==2233)

estado=223;

}

else if (strcmp(temp,"/senha")==0)

{

if (estado==214)

estado=21;

else

exit(0);

}

else if (strcmp(temp,"/aplicativos")==0)

{

if (estado==22)

estado=2;

else

exit(0);

}

else if (strcmp(temp,"/logistica")==0)

{

if (estado==3)

estado=0;

else

exit(0);

}

else if (strcmp(temp,"/setor")==0)

{

if (estado==31)

estado=3;

else

exit(0);

}

else if (strcmp(temp,"/responsavel")==0)

{

if (estado==32)

estado=3;

else

exit(0);

}

else if (strcmp(temp,"/patrimonio")==0)

{

if (estado==33)

estado=3;

else

exit(0);

}

}

}

free(temp);

fclose(entrada);

return l;

}

  • mês depois...
Postado

A estrutura do código não ficaria mais limpa de você utilizasse CASE ao invés de if's e else if's?

acho que seria uma boa pedida.

e a identação não está clara. fica ruim de ler o código. talvez por isso ninguem tenha se habilitado a dar uma resposta...

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

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!