Ir para conteúdo

POWERED BY:

Arquivado

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

vhbsouza

Leitura de Arquivo

Recommended Posts

Oi...

tenho um trabalho da faculdade pra fazer...que eu tenho que ler um nome contendo no maximo 30 caracteres e um numero de cpf contendo 11 digitos, que está em um arquivo já criado e tenho que ordenar os nomes de acordo com o numero de CPF do menor para o maior. E nesse arquivo pode ter até 100 linhas

 

o conteúdo do arquivo é esse olhem...

victor hugo sadsadsad dh dahss12345678914

dssorasddas ernarze addasouza12345678914

como eu faço para ler do arquivo para o struct

o meu código até agora:

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

struct nomes
{
   char nome[31];
   char cpf[12];
}fichas[100];

int main()
{
	FILE*arq;
   int i=0,j;

   if((arq=fopen("arq.txt","r+"))==NULL)
   {
	  printf("Erro ao abrir o arquivo.");
	  for(i=0;i<=2;i++)
		  putch(7);

   }
   else
   {
		while(i<100 && !feof)
	  {
		 gotoxy(1,1);
		 //fseek(,,);
		  for(j=0;j<=30;j++)
		 	fichas[i].nome[j]=fgetc(arq);
		 fgetc(arq);
		 for(j=0;j<=11;j++)
		 	fichas[i].cpf[j]=fgetc(arq);

		 gotoxy(1,1);
		 printf("%s ",fichas[1].nome);

		 i++;
	  }
   	getch();
   }
}
ele está compilando e dá 2 Warnings mais não exibe nada na tela

 

vocês podem me ajudar?

Compartilhar este post


Link para o post
Compartilhar em outros sites

oq você pode fazer pra ter segurança, é ir lendo o arquivo até EOF..

use fgets, ai vai jogando esse conteudo pra uma variavel auxiliar, ai depois joga na struct algo assim:

while (!feof(arq)){
	fgets(linha,80,arq);
	//ai aki você divide a string e joga o conteudo certo pras respectivas variaveis..

}

ñ sei c você chegou entender, + qlqr duvida posta ae;

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

você pode fazer...

 

enquanto (auxiliar != algo)

outra_string = auxiliar;

i++;

fim_enquanto

 

algo assim

Compartilhar este post


Link para o post
Compartilhar em outros sites

você pode fazer...

 

enquanto (auxiliar != algo)

outra_string = auxiliar;

i++;

fim_enquanto

 

algo assim

naum entendi isso não....

 

você não pode me mostrar usando as variáveis que eu usei?

 

fikaria mais claro

Compartilhar este post


Link para o post
Compartilhar em outros sites

olha para melhor explicar você pode copiar para a outra string td q for letra, ai qnd for numero joga pra variavel q armazena o cpf..

 

veja sobre a biblioteca ctype

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não estou conseguindo....

 

tentei de todos os jeitos que consegui.

 

alguem pode me mostrar como q fica o codigo...

o que consegui fazer até o momento é esse:

 

#include <stdio.h>
#include <ctype.h>
#include <conio.h>
#include <string.h>

struct nomes
{
   char nome[31];
   char cpf[12];
}fichas[100];

int main()
{
	FILE*arq;
   int i,j,k;
   char aux[40];

   if((arq=fopen("arq.txt","r+"))==NULL)
   {
	  printf("Erro ao abrir o arquivo.");
	  for(i=0;i<=2;i++)
		  putch(7);
	  return 0;

   }
   rewind(arq);
   i=0;
   while(!feof(arq))
   {

		fgets(aux,strlen(aux)+1,arq);
	  j=0;
	  while(!isdigit(aux[j])&& j<=29)
	  {
		 fichas[i].nome[j]=aux[j];
		  j++;
	  }
	  i++;
 	}

   //Laço para testar o que já foi feito até o momento
   printf("%s\n",fichas[0].nome);

   fclose(arq);
   getch();
   return 0;
}

Percebi que fichas.nome armazena apenas 3 caracteres da string por exemplo...

se no arquivo tiver a string "victor hugo bernardes de souza"=30 caracteres

 

fichas[0].nome="vic"

fichas[1].nome="tor"

fichas[2].nome=" hu"

fichas[3].nome="go "

fichas[4].nome="ber"

...

assim em diante...

 

não consigui corrigir esse erro....

alguem pome me mostrar cmo q eh?

Compartilhar este post


Link para o post
Compartilhar em outros sites

troque isso:

fgets(aux,strlen(aux)+1,arq);
por isso:

fgets(aux,40,arq);

bom aki funfo.

 

[]'s

 

----

Bom to sem tempo para ver bem o código pq to em aula agora, + deu pra fazer algo rapido.. veja:

 

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

struct nomes
{
   char nome[31];
   char cpf[12];
}fichas[100];

int main()
{
	FILE*arq;
   int i,j,k;
   char aux[41];

   if((arq=fopen("arq.txt","r+"))==NULL)
   {
	  printf("Erro ao abrir o arquivo.");
	  exit(1);
   }
   rewind(arq);
   i=0;
   while(!feof(arq))
   {
	  fgets(aux,40,arq);
	  j=0;
	  while(!isdigit(aux[j]) && j<=29)
	  {
		 fichas[i].nome[j]=aux[j];
		  j++;
	  }
	  int x = 0;
	  while(j<=39){
		 fichas[i].cpf[x]=aux[j];
		 j++;
		 x++;
	  }
	  ++i;
	}

   //Laço para testar o que já foi feito até o momento
   printf("Nome: %s Cpf: %s\n",fichas[0].nome, fichas[0].cpf);
   printf("Nome: %s Cpf: %s\n",fichas[1].nome, fichas[1].cpf);
// printf("Nome: %s Cpf: %s\n",fichas[2].nome, fichas[2].cpf);

   fclose(arq);
   getch();
   return 0;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fiz umas alterações, vejam ai...tava tentando fazer algo pra tratar o nome no arquivo .txt, caso tivesse mais de 30 chars mas não obtive sucesso, consegui fazer essa máscara apenas na qtd de números do CPF.

 

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

typedef struct
{
	char nome[31];
	char cpf[12];
}nomes;
nomes fichas[100];

void inic_lista();

int main()
{
	FILE *fp;
	char aux[41];
	int j,i,x,k;
	int cont;

	if((fp = fopen("teste.txt","r")) == NULL)
	{
		printf("O arquivo nao pode ser aberto!");
		exit(1);
	}
	inic_lista();

	i = 0;
	while(!feof(fp))
	{
		fgets(aux,40,fp);
		j = 0;
		while(!isdigit(aux[j]) && j<=29)
		{
			fichas[i].nome[j] = aux[j];
			j++;
		}
		x = 0;
		while((j<=39) && (x<=10) && (aux[j] != '\n') && (isdigit(aux[j])))
		{
			fichas[i].cpf[x] = aux[j];
			j++;
			x++;
		}
		i++;
	}
	//Mostra lista
	for(k=0;k<100;k++)
	{
		if(fichas[k].nome[0])
		{
			printf("Nome: %s CPF: %s",fichas[k].nome,fichas[k].cpf);
			printf("\n");
		}
	}
	fclose(fp);
	system("PAUSE");
	return 0;
}

void inic_lista()
{
	int i;
	for(i=0;i<100;i++)
	{
		fichas[i].nome[0] = '\0';
	}
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ow... vlw.. gRoOvE e quitZAUMMM eu juntei parte do código que vcs dois melhoraram...e fiz algumas alterações que se adequavam no meu problema...e deu certo...

 

mais agora falta a parte da ordenação....dos nomes de acordo com o CPF...

 

vocês podem me ajudar nessa parte tbm?

 

tipo ...

qq vcs acham que seria melhor... eu ordenar no msm struct... , alterar em outra struct .... ow alterar o indice das structs?...

 

 

e só mais uma coisa... no Trabalho ... eu tenho que enfeitar o programa...sabe.. pra deixar uma aparência mais amigável para o usuário... ( nada de VISUAL ESPARTANO)....por isso q eu to usando a conio.h vocês tem algumas dicas pra eu melhorar a aparência do programa?

 

t+...vlw....

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aparencia amigavel em 2008 != enfeite

 

Enfeite = cores,gotoxy,etc

 

Aparencia amigavel em 2008 = caixa de texto, menu clicável, janela, botões.

 

 

Se você ta programando p/ windows use a API do windows p/ fazer as coisas (provavelmente é mais fácil) e não os remendos da época do DOS.

Compartilhar este post


Link para o post
Compartilhar em outros sites

exite uma função pronta jah para ordenação..

veja sobre

 

qsort

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aparencia amigavel em 2008 != enfeite

 

Enfeite = cores,gotoxy,etc

 

Aparencia amigavel em 2008 = caixa de texto, menu clicável, janela, botões.

 

 

Se você ta programando p/ windows use a API do windows p/ fazer as coisas (provavelmente é mais fácil) e não os remendos da época do DOS.

Mais então ISIS.... como que eu faço pra usar a API... eu busquei muitas coisas sobre isso que você flou ... na Internet e tudo que eu encontrei eu não consegui fazer rodar nos meus programas....

 

você sab....como que eu faço pra redimensionar o tamanho da janela do console do DOS... tipo..

colocar em tela cheia...

 

Mais não é com o ALT-Enter.. pq com ele o usuário precisa apertar essas duas teclas...

 

eu queria que quando o usuário rodasse o programa .... ele já iniciasse em tela cheia....

 

aguardando sua resposta...

flw..

Compartilhar este post


Link para o post
Compartilhar em outros sites

P/ emular porcamente uma tela cheia execute esse comando:

 

mode con cols=1024 lines=700

 

Detalhe: você tem que saber a resolucao do monitor p/ fazer isso.

 

Ou use a API do windows pra ir modificando as propriedades.

 

Sobre as teclas: um "listener" faz o trabalho. É igual você apertar Ctrl+D no Vim p/ rolar o texto...

Compartilhar este post


Link para o post
Compartilhar em outros sites

P/ emular porcamente uma tela cheia execute esse comando:

 

mode con cols=1024 lines=700

 

Detalhe: você tem que saber a resolucao do monitor p/ fazer isso.

 

Ou use a API do windows pra ir modificando as propriedades.

 

Sobre as teclas: um "listener" faz o trabalho. É igual você apertar Ctrl+D no Vim p/ rolar o texto...

.....

 

 

ow vlw.. isso funcionou.....

 

mais eu naum entendi essa parte aqui.......

Sobre as teclas: um "listener" faz o trabalho. É igual você apertar Ctrl+D no Vim p/ rolar o texto...

qq é esse listener....

 

t+

Compartilhar este post


Link para o post
Compartilhar em outros sites

No caso da biblioteca do Windows, se você já começou a estudar:

 

No processo da janela, você adiciona um case no switch:

 

case WM_KEYDOWN:

Isso vai capturar as teclas digitadas pelo teclado; então para pegar qual tecla foi digitada, usa isso aqui:

 

LOWORD(wParam)

Exemplo prático, tirado do código fonte de um programinha de Windows que postei no laboratório de códigos fontes:

 

case WM_KEYDOWN:
switch(LOWORD(wParam))
{
	case VK_LEFT:
	movex = -5;
	break;
	case VK_RIGHT:
	movex = 5;
	break;
	case VK_UP:
	movey = -5;
	break;
	case VK_DOWN:
	movey = 5;
}
break;

Quando quiser comparar com letras, você pode botar a letra maiúscula no case direto, exemplo:

 

case WM_KEYDOWN:
switch(LOWORD(wParam))
{
	case 'A':
	MessageBox(hwnd, "Você digitou A!", "Digitou", MB_OK);
	break;
	case 'B':
	MessageBox(hwnd, "Você digitou B!", "Digitou", MB_OK);
	break;
}
break;

Você pode usar o código que eu postei no laboratório, e ler esse site aqui pra aprender mais sobre a biblioteca do Windows: http://www.winprog.org/tutorial/ (em inglês)

Inclusive ensina como criar controles como combobox e text input que acho que é o que você quer!

 

Agora, se você vai fazer em DOS não posso te ajudar porque não sei nada sobre eventos no DOS ^^

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.