Ir para conteúdo

POWERED BY:

Arquivado

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

Pablo Honey

Ler arquivo .txt de varios tipos - Linguagem C

Recommended Posts

Bom dia amigos... Estou com o seguinte problema... Foi passado um arquivo teste.txt, com os seguintes dados.

 

5
123.987.098-09
RODRIGO DE SOUZA GANDRA
1500.78
CONTABILIDADE
123.987.098-09
RODRIGO DE SOUZA GANDRA
1500.78
CONTABILIDADE
723.987.098-15
PEDRO PAULO RANGEL
500.00
TESOURARIA
123.987.098-09
MARIA MENDONÇA DE SOUZA
400.15
FATURAMENTO
456.987.098-11
FELIPE DE MATTOS
700.76
CONTABILIDADE
Onde 5 é o inteiro onde irei trabalhar alocação dinamica,ou seja, só poderei trabalhar com 5 funcinarios. O problema que estou encotrando por nunca ter feito nenhum exercicio do tipo e os varios dados de varios tipos. CPF: char / nome: char / salario: float / setor: char.

 

Já fiz exercicio de leitura de arquivo mas com matriz onde é mais facil trabalhar. Como posso ler esse arquivo se nem um loop posso usar? O professor pediu que passasse os dados para um tipo mylista. A minha estrutura é essa

 

typedef struct 
{
	   char matricula;
	   char nome[40];
	   char setor[40];
	   char salario;
	   
}func;

typedef struct 
{
	   int primeiro,ultimo;
	   func item[40];
}tipolista;

Outra coisa sobre a minha alocação dinamica, estou fazendo correto?

 

int i,j,d,*m;
	  
	  FILE*arq;
	  arq=fopen("lista.txt","r");
		 fscanf(arq,"%d",&d);
		 printf("%d",d);
		 m=calloc(d,sizeof(func));aqui eu uso o tipo da estrutura?

Amigos, não estou pedindo que façam o meu exercicio, e sim que mim ensinem preciso aprender o quanto antes isso, até pq não quero mim dar mal nas provas. Então desde já meu muito obrigado aqueles que puderem ajudar. Até mais...

Compartilhar este post


Link para o post
Compartilhar em outros sites

ele qr q você leia um arquivo.txt sem um loop??? estranho pq ele le o arquivo até encontrar EOF(end of file)! é isso msm q eu entendi?

e sobre alocação dinamica vow ser sincero q nunca fui muito fã!

olhe nessa apostila de C na página 105 sobre alocação dinamica!

 

volte a postar []'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

ele qr q você leia um arquivo.txt sem um loop??? estranho pq ele le o arquivo até encontrar EOF(end of file)! é isso msm q eu entendi?

e sobre alocação dinamica vow ser sincero q nunca fui muito fã!

olhe nessa apostila de C na página 105 sobre alocação dinamica!

 

volte a postar []'s

 

Não ele não disse que não quer um loop... Eu que não estou encontrando uma forma de ver jogando o loop para ler os dados, eu sei como separar os 05 conjuntos dentro do arquivo. Entendeu... tipo como farei para que o arquivo leia corretamente cada item um abaixo do outro. Por exemplo se eu colocar um loop

 

for(i=0;i<5//quantidade de alunos a ser inserido;i++)

 

Como procedo aqui pois aqui terei que ler cada linha com tipos diferente mas numa estrutura por exemplo. Na minha opinião esse loop daria errado, já que ele pegaria as 5 primeiras linhas e o resto do meu arquivo fica lascado... Preciso entender como ele vai separar os varios blocos dentro do arquivo.

 

Falow

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vamos lá então.

 

Os tipos de dados do arquivo tem que ser compatíveis com a struct.

Matrícula por exemplo precisa ser uma string, repare que tem um hífen "-", já salário pode ser float.

Temos então uma struct assim:

 

typedef struct
{
	   char matricula[20];
	   char nome[40];
	   char setor[40];
	   float salario;
	  
}func;

 

Para alocação dinamica voce pode usar o malloc. Assim:

 

funcionario = (func*) malloc(sizeof(func));

Agora funcionario terá um espaço reservado equivalente a uma estrutura.

Para acessar nome apartir desse espaço alocado faça: funcionario->nome.

A cada alocação voce precisa de uma outra estrutura para guardar essa informação.

 

typedef struct
{
	   func *item;
	   tipolista *proximo;
}tipolista;

O comportamento disso passa a ser como uma lista encadeada.

 

Sei que não é fácil, mas vamos ver o que evolui no código para podermos resolve-lo.

 

http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Para dar mais uma clareada:

 

// loop para com a sequencia desejada.

   // faca alocao como foi dito no outro post
   // use a funcao fgets para pegar os dados do arquivo, essa funcao retorna uma linha inteira de dado.

   fgets(linha, 255, arquivo)
   strcpy (funcionario->matricula, linha);

   // assim por diante, até preencher a estrutura

   // aqui voce pode chamar uma funcao para enfileirar a estrutura
 
// fim do laco

http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Kandrade obrigado pela força, valeu mesmo... aqui esta o meu codigo até o momento... mas ainda continuo com duvida na parte de alocação e de ler o arquivo... a alocação tá dando erro ou então o meu dev-C++ como sempre não ta aceitando nda... aguardo um opinião a respeito. Outra coisa... O codigo na minha opinião esta feio, pois tem muita coisa no main... Mas foi o professor que nos fez fazer dessa forma, falei com ele que trabalhando separado os modulos as funções, ficaria mais visualizavel... mas ele disse que queria dessa força para deixar um pouco mais complicado e que assim fica mais legivel o que quer dentro do main... mas tudo bem. Obrigado fico no aguardo...

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


typedef struct 
{
	   char cpf[20];
	   char nome[40];
	   char setor[40];
	  float salario;
	   
}func;

typedef struct 
{
	   int primeiro,ultimo;
	   func item[40];
}tipolista;

void fazlistavazia(tipolista *lista)
{
	 lista->primeiro=0;
	 lista->ultimo = lista->primeiro;
 }

int verificalistavazia(tipolista lista)
{
	return( lista.primeiro==lista.ultimo);
 }

int insere(func x,tipolista *lista)
{
  strcpy(lista->item[lista->ultimo].cpf,x.cpf);   
  strcpy(lista->item[lista->ultimo].nome,x.nome);
  strcpy(lista->item[lista->ultimo].setor,x.setor);
  lista->item[lista->ultimo].salario = x.salario;  
  
  lista->ultimo++;
}

void imprime(tipolista *lista)
{
	 int i;
	 for (i=0;i<lista->ultimo;i++)
	 {
		 printf("CPF %s",lista->item[i].cpf);
		 printf("\nNOME..... %s",lista->item[i].nome);
		 printf("\nSetor..... %s",lista->item[i].setor);
		 printf("\nSalario... %f",lista->item[i].salario);
				  
		 }
	 }

main()
{
 
 func *mylista;
  func x;
 
	int d,i;
   	char linha[255]; 
	FILE*arq;
	arq=fopen("lista.txt","r");
	fscanf(arq,"%d",&d);
	printf("\n%d",d);
	
   	for (i = 0; i < d; i++)
	mylista = (func *) malloc(sizeof(func));//linha dando erro...
	
	 fgets(linha, 255, arq);
	 strcpy (mylista->cpf, linha);
	 fgets(linha, 255, arq);
	 strcpy(mylista->nome,linha);
	 fgets(linha, 255,arq);
	 mylista->salario,linha;
	 fgets(linha,255,arq);
	 strcpy(mylista->setor,linha);
	 

	

}
tipolista(mylista); 

 imprime(mylista);
 printf("Informe a cpf: ");
 scanf("%s",&x.cpf);
 printf("Informe o nome: ");
 scanf("%s",&x.nome);
 printf("Informe o salario ");
 scanf("%f",&x.salario);
 printf("Informe o setor: ");
 scanf("%s",&x.setor);
 insere(x,mylista);
 imprime(mylista);
 system ("pause"); 
 
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vou comentando no proprio código

 

main()
{
tipolista mylista; // mylista tem que ser um ponteiro de func, pois esse eh o tipo de retorno de malloc
// ficaria assim: func *mylista;
	int d,i;
	char linha[255];
	FILE*arq;
	arq=fopen("lista.txt","r");
	fscanf(arq,"%d",&d); // aqui voce le a quantidade correto?
	printf("\n%d",d); // aqui imprime o que foi lido
	
	mylista = (func *) malloc(d * sizeof(func));//linha dando erro...

   // voce deve alocar uma por uma, entao a quantidade some
   // ficaria:  mylista = (func *) malloc(sizeof(func));
 
   // fgets pega uma linha, provavelmente o codigo do primeiro funcionario
	 fgets(linha, 255, arq);// é isso mesmo estou indo no caminho certo?

   // nao precisa desse sscanf
   //   sscanf(linha, "%d", &d);//isso aki peguei num codigo que estava estudando vi que tinha alguma coisa haver mas nunca usei

	// o loop comeca antes da alocacao
	//for (i = 0; i < d; i++)
   // boa, li cpf, copei para a variavel
	strcpy (mylista->cpf, linha);
   // antes de copiar precisa ler outra linha do arquivo
   // outro fgets(linha, 255, arq);
	strcpy (mylista->nome,linha); //é isso mesmo????

Dentro do loop voce terá:

 

- A alocação de cada estrutura.

- A leitura de uma linha

- Copia do conteúdo

isso para todas as variáveis da estrutura: cpf, nome, salario e setor.

 

Vou analisar o restante e depois posto o que encontrei.

 

http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Kandrade fiz o que você mim ensinou... porém minha estrutura parou de funcionar :unsure: tipo... a minha mylista agora é func - então tudo que tipolista não irá funcionar.... O que devo fazer... criar outro tipo jogando a func mylista para um tipo lista... porém elas não reconhecem... Agora to meio confuso http://forum.imasters.com.br/public/style_emoticons/default/blush.gif pois era uma estrutra dentro de outra estrutura... a alocação agora não deu erro...

 

As alterações lancei no post anterior para não ficar muito extenso...

 

Obrigado...

Ate mais...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Voce poderia criar 5 estruturas estáticas, assim:

 

func mylista[5];

e trabalhar como se fosse um vetor, mas como quer alocação dinâmica a estrutura que armazenará os dados alocados será como essa:

 

typedef struct
{
	   func *item;
	   tipolista *proximo;
}tipolista;

Um ponteiro que indica o local dos dados e um ponteiro apontando para o próximo elemento.

 

Voce precisa agora criar uma função que recebe o ponteiro de uma func e o enfilere nessa outra estrutura apresentada.

 

Se não andar te ajuda nesse ponto.

 

http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.