Ir ao conteúdo

C fscanf n esta funcionando


Ir à solução Resolvido por Ansi C,

Posts recomendados

Postado

Olá eu estou tentando pegar dados de um arquivos de texto e ele esta formatado porque usei o fprintf para colocar no arquivo mas quando tento recuperar os dados o retorno n é o esperado

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

int main(int argc, char const *argv[])
{
	int cad_id, cad_id_res;
	char cad_nome[20], cad_nome_res[20];
	int cad_telefone, cad_telefone_res;

	FILE *arquivo;

	arquivo = fopen("arquivos/teste.txt", "a+");

	if (arquivo == NULL)
	{
		arquivo = fopen("arquivos/teste.txt", "w");

		if (arquivo == NULL)
		{
			CreateDirectory("arquivos", NULL);
			arquivo = fopen("arquivos/teste.txt", "w");
		}
		else
		{
			fclose(arquivo);
			arquivo = fopen("arquivos/teste.txt", "a+");
		}
	}

	printf("Digite o id: ");
	scanf("%i", &cad_id);

	setbuf(stdin, NULL);

	printf("Digite o nome: ");
	scanf("%[^\n]", cad_nome);

	setbuf(stdin, NULL);

	printf("Digite o telefone: ");
	scanf("%i", &cad_telefone);

	clientes->id = cad_id;
	strcpy(clientes->nome, cad_nome);
	clientes->telefone = cad_telefone;

	fprintf(arquivo, "%05i %-20s %9i\n", clientes->id, clientes->nome, clientes->telefone);

	fscanf(arquivo, "%i %20s %i\n", &cad_id_res, cad_nome_res, &cad_telefone_res);

	printf("%i %s %i \n", cad_id_res, cad_nome_res, cad_telefone_res);

	fclose(arquivo);

	system("pause");
	return 0;
}

 

  • Obrigado 1
Postado

@Gabriel Paulucci Olá! Depois de gravar você pode move o ponteiro do fluxo para o começo do arquivo.

 

Pode fazer isso no mesmo ponteiro, pois na implementação ele foi aberto no modo "a+" leitura e gravação. Porém como o indicador setado no fim do arquivo (append) para acrescentar. Para ler o seu conteúdo do começo, basta reiniciar o fluxo.

/*- Ler os dados ... -*/
    rewind(arquivo); /* do começo */
    fscanf(arquivo, "%5i %20s %9i\n", &cad_id_res, cad_nome_res, &cad_telefone_res);

 

Consulte também fseek.

 

Você entendeu isso?

  • Curtir 1
Postado

eu estou tendo como retorno 

image.png.be4dd9de1302bde1bdb95411b9830d7e.png

 

e no arquivo de texto esta 

00025-teste sla           -123456789

ja tentei colocar

fprintf("%05i-%-20s-%9i");

e depois pegar com

fscanf("%5[^-]%20[^-]%i\n");

(sei que coloquei com partes faltando) mas n vai 

Postado

É o que está sendo gravado no aquivo?

 

Nesta informação você não pressiona  "-" em momento algum, no algoritmo acima do post original essa não é string de formatação que estava usando! Pode por gentiliza atualizar o post.

 

Que a amanhã eu verifico essa string de formatação.

13 minutos atrás, Gabriel Paulucci disse:

eu estou tendo como retorno 

image.png.be4dd9de1302bde1bdb95411b9830d7e.png

 

  • Solução
Postado

@Gabriel Paulucci Você precisa definir, absolutamente como pretende gravar esses dados, porque a escolha de gravação surtira efeito tanto no layout dentro do arquivo como também na strings de formatação nas funções de leitura. Então, observei que a maior dificuldade de leitura é o campo nome porque os espaços não são capturados quando usado "%s". O mesmo problema não existe no uso do formatador "%c" (para caracteres), por exemplo, "%20c" vai captura, se no scanf, os 20 primeiros caracteres, consequentemente, apenas a parte interessante da string no teste (nome). Para função printf usa-se "%-.20s", ou seja, limita-se a saída de 20 caracteres,  o mesmo número na formatação de fscanf.

 

Sim! Tem esse pontinho antes do sinal de subtração, pois não se trada do tamanho do campo, como é o caso de fprintf, mas sim, da quantidade de caracteres na saída daquele campo.

 

Resumo

  • para fscanf: "%5i %20c %9i"
  • para fprintf: "%05i %-20s %09i"
  • para printf:  "%05i %-.20s %09i

 

Imagem Ilustrativa (sujeita a remoção)

ansic201804101016.png.80dd887c2071f141f642fee3e24084f3.png

 

 

― Tem mais algo?

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

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...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!