Ja quebrei a cabeca e nao sai do lugar.
Quem puder me ajudar...agradeco
Obs(me nivel de desespero é tanto que ate pago), nao muito rsrsr
//-> estrutura do arquivo C++
#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 memoria;
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]='\0';
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,"memoria")==0 && estado==1)
{
estado=12;
l->fim->pc->hw.memoria=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,"/memoria")==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;
}
void escreverSaida1(lista *l,char endereco[],int memoria)
{
//implemente aqui
}
void escreverSaida2(lista *l,char endereco[],char nome[],char versao[])
{
//implemente aqui
}
void imprimir(lista *l)
{
no_computador *aux=l->inicio;
while (aux!=NULL)
{
printf("fabricante: %s\n",aux->pc->hw.cpu.fabricante);
printf("modelo: %s\n",aux->pc->hw.cpu.modelo);
printf("clock: %f\n",aux->pc->hw.cpu.clock);
printf("memoria: %d\n",aux->pc->hw.memoria);
printf("hd: %d\n",aux->pc->hw.hd);
opcionais_hardware *aux1=aux->pc->hw.op_hw;
while (aux1!=NULL)
{
printf("opcional: %s %s\n",aux1->nome,aux1->descricao);
aux1=aux1->proximo;
}
printf("s.o.: %s\n",aux->pc->sw.so.nome);
printf("versao: %s\n",aux->pc->sw.so.versao);
printf("instalacao: %d/%d/%d\n",aux->pc->sw.so.data_instalacao.dia,aux->pc->sw.so.data_instalacao.mes,aux->pc->sw.so.data_instalacao.ano);
printf("senha: %s\n",aux->pc->sw.so.senha);
aplicativos *aux2=aux->pc->sw.app;
while (aux2!=NULL)
{
printf("aplicativos: %s %s %d/%d/%d\n",aux2->nome,aux2->versao,aux2->data_instalacao.dia,aux2->data_instalacao.mes,aux2->data_instalacao.ano);
aux2=aux2->proximo;
}
printf("setor: %s\n",aux->pc->logt.setor);
printf("responsavel: %s\n",aux->pc->logt.responsavel);
printf("patrimonio: %d\n\n",aux->pc->logt.patrimonio);
aux=aux->proximo;
}
}
void menu()
{
system("cls");
printf(" | |\n");
printf(" | <1> Abrir \"entrada.txt\" |\n");
printf(" | <2> Imprimir |\n");
printf(" | <3> Relatorio 1 (\"saida1.txt\") |\n");
printf(" | <4> Relatorio 2 (\"saida2.txt\") |\n");
printf(" | <5> Sair |\n");
printf(" | |\n");
printf(" |------------------------------------------------|\n\n");
printf("\t\tOpcao: ");
}
int main()
{
lista *l=NULL;
char opcao;
do
{
menu();
fflush(stdin);
opcao=getchar();
switch(opcao)
{
case '1':
l=lerArquivo("entrada.txt");
system("cls");
printf("\n\tArquivo aberto com sucesso!\n\n\n");
system("pause");
break;
case '2':
system("cls");
if (l!=NULL)
imprimir(l);
else
printf("\n\tLista vazia!\n\n\n");
system("pause");
break;
case '3':
system("cls");
if (l!=NULL)
{
int memoria;
printf("\n\n\tMemoria menor que : ");
scanf("%d",&memoria);
escreverSaida1(l,"saida1.txt",memoria);
printf("\n\tRelatorio 1 emitido com sucesso!\n\n\n");
}
else
printf("\n\tNao foi possivel emitir relatorio 1!\n\n\n");
system("pause");
break;
case '4':
system("cls");
if (l!=NULL)
{
char nome[TAM_STRING];
char versao[TAM_STRING/2];
printf("\n\n\tNome : ");
fflush(stdin);
fgets(nome,TAM_STRING,stdin);
nome[strlen(nome)-1]='\0';
printf("\n\tVersao : ");
fflush(stdin);
fgets(versao,TAM_STRING/2,stdin);
versao[strlen(versao)-1]='\0';
escreverSaida2(l,"saida2.txt",nome,versao);
printf("\n\tRelatorio 2 emitido com sucesso!\n\n\n");
}
else
printf("\n\tNao foi possivel emitir relatorio 2!\n\n\n");
system("pause");
break;
default:
if (opcao!='5')
continue;
}
} while(opcao!='5');
}
//-> estrutura do arquivo de entrada.txt
0.<computador>
1.<hardware>
11.<processador>
111.<fabricante>Intel</fabricante>
112.<modelo>Core 2 Duo</modelo>
113.<clock>2.5</clock>
</processador>
12.<memoria>2048</memoria>
13.<hd>250</hd>
14.<opcionais_hardware>
141.<nome>Placa de video</nome>
142.<descricao>Nvidia 9600 GT</descricao>
</opcionais_hardware>
</hardware>
2.<software>
21.<sistema_operacional>
211.<nome>Windows</nome>
212.<versao>Vista</versao>
213.<data_instalacao>
2131.<dia>16</dia>
2132.<mes>10</mes>
2133.<ano>2008</ano>
</data_instalacao>
</sistema_operacional>
214.<senha>123mudar</senha>
22.<aplicativos>
221.<nome>Br.office</nome>
222.<versao>3.0</versao>
223.<data_instalacao>
2231.<dia>16</dia>
2232.<mes>10</mes>
2233.<ano>2008</ano>
</data_instalacao>
</aplicativos>
</software>
3.<logistica>
31.<setor>DTIC</setor>
32.<responsavel>Joana Maria</responsavel>
33.<patrimonio>20333</patrimonio>
</logistica>
</computador>
------------------------------------
Nota da Moderação (Sygecom): Topico editado para colocar dentro da TAG [ CODE ]