Ir ao conteúdo
  • Cadastre-se

C Problema em ler linhas em um arquivo


bartolomeu kuma

Posts recomendados

Estou tendo problemas em ler consecutivamente linhas em um arquivo, ele é composto por:

jose

536

jose

536

 

e a estrutura que coloquei para lê-lo foi:

 

fgets

fscanf´(lê como inteiro)

fgets

fscanf ´(lê como inteiro)

 

porém, quando imprimo os dados lidos o resultado é:

 

jose

567

 

0

 

 como conserta isso?

Link para o comentário
Compartilhar em outros sites

Citação

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

struct pessoa{
	char nome[100];
	int codigo;
	
};

int main(int argc, char **argv)
{
	FILE *p = fopen("jose.txt","r");
	struct pessoa ind[2];

	fscanf(p,"%[^\n]s", ind[0].nome);
	fscanf(p,"%d",&ind[0].codigo);
	fscanf(p,"%[^\n]s", ind[1].nome);
	fscanf(p,"%d",&ind[1].codigo);


		
	puts(ind[0].nome);
	printf("%d\n", ind[0].codigo);
	puts(ind[1].nome);
	printf("%d\n", ind[1].codigo);

	
	
	fclose(p);
	
	return 0;
}

 

 

No caso, estava tentando ler uma strings, depois um inteiro, e assim sucessivamente, mas retornava espaços vazios quando imprimia. Troquei o fgets para o fscanf, mas mesmo assim ele não lê a linha do arquivo apos o segundo fscanf, o retorno está assim:

 

jose

536

 

0

 

colocando o arquivo como:

563

jose

jose

563

 

imprime isso:

 

563

0

jose

0

 

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

fscanf(p,"%d",&ind[0].codigo);
fgets(ind[0].nome,100,p);
fgets(ind[1].nome,100,p);
fscanf(p,"%d",&ind[1].codigo);

queria entender porque quando coloco para ler um nome com espaço, seja com fscanf usando o [^\n] ou fgets, o programa não sai certo como se lesse apenas sem espaço, com o fscanf normal;

 

quando coloco o código acima no mesmo código que tu enviou sai:

 

563

 

jose

 

0

Link para o comentário
Compartilhar em outros sites

Na linguagem C, não use fscanf e nem scanf (mesmo que o anterior, mas orientado ao stdin), visto que essas funções incluem caracteres indesejados no processo. O indicado é aplicar sempre fgets e, se necessário, atoi de stdlib.h para converter string em valor integral.

 

 

 

Espero ter ajudado GbhmuXl.gif.

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

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
struct pessoa{
	char nome[100];
	int codigo;
	
};

int main(int argc, char **argv)
{
	FILE *p;
	p = fopen("421.txt","r");
	struct pessoa ind[2];
	
	fscanf(p,"%d",&ind[0].codigo);
	fscanf(p,"%s", ind[0].nome);
	fscanf(p,"%s", ind[1].nome);
	fscanf(p,"%d",&ind[1].codigo);

	printf("%s\n",ind[0].nome);
	printf("%d\n",ind[0].codigo);
	printf("%s\n",ind[1].nome);
	printf("%d\n",ind[1].codigo);

	
	
	fclose(p);
	
	return 0;
}

 

1.png

Link para o comentário
Compartilhar em outros sites

@bartolomeu kuma

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
struct pessoa{
	char nome[100];
	char codigo[100];
};

int main(int argc, char **argv)
{
	FILE *p;
	p = fopen("421.txt","r");
	struct pessoa ind[2];	
	fgets(ind[0].codigo,100,p);
	fgets(ind[1].nome,100,p);
	fgets(ind[0].nome,100,p);
	fgets(ind[1].codigo,100,p);
	/*fscanf(p,"%d%d",&ind[0].codigo);
	fscanf(p,"%s%s", ind[0].nome);
	fscanf(p,"%s", ind[1].nome);
	fscanf(p,"%d",&ind[1].codigo);*/

	printf("%s\n",ind[0].nome);
	printf("%s\n",ind[0].codigo);
	printf("%s\n",ind[1].nome);
	printf("%s\n",ind[1].codigo);

	
	
	fclose(p);
	
	return 0;
}

 

1.png

Link para o comentário
Compartilhar em outros sites

vocês tão tendo problema porque ao ler dados do arquivo estão lendo o \n junto com o string. É o mesmo problema que vocês tem quando tentam ler 2 chars por teclado, ou 2 strings.... Lixo no buffer hsheushehe
Screenshot_1.jpg.6c6395a127a98706e5d290d80dacf1a2.jpg

adicionado 0 minutos depois

Se quiserem saber o por quê é só dizer.

Link para o comentário
Compartilhar em outros sites

Sim... exato. Mas é o \n que tá no arquivo que ta causando erros de leitura não o extra que você colocou depois do %s

O arquivo ta assim:
Screenshot_3.jpg.a9df41c4759d14cb83d1c665b5e0d218.jpg

qualquer editor pode lhe dizer o que há... ativando a opção para mostrar SHOW END OF LINE
Screenshot_4.jpg.0ae0231a5b338c6369a0995b0fe24354.jpg
Dai você pode ver:
Screenshot_6.jpg.4444effaffa447452cdc5a8b1e3ec9a1.jpg

 

Se usar fgets vai dar erros.

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

Visitante
Este tópico está impedido de receber 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...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!