Ir ao conteúdo
  • Cadastre-se
Gabriel Paulucci

C Não estou conseguindo pegar corretamente as informações do arquivo de texto

Recommended Posts

Olá eu criei um programa que grava as informações de pesquisa elas mas n hora de pesquisar n esta funcionando e n sei o motivo de isso estar acontecendo

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

int main(int argc, char const *argv[])
{
	struct cadastro
	{
		int id;
		char nome[21];
		int telefone;
	}clientes[10];

	int cad_id_res;
	char cad_nome[21], cad_nome_res[21];
	int cad_telefone, cad_telefone_res;

	FILE *arquivo;
	FILE *ultimoid;

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

	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+");
		}
	}

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

		if (ultimoid == NULL)
		{
			CreateDirectory("arquivos", NULL);
			ultimoid = fopen("arquivos/ultimoid.txt", "w");
		}
		else
		{
			fprintf(ultimoid, "0");
			fclose(ultimoid);
			ultimoid = fopen("arquivos/ultimoid.txt", "r+");
		}
	}

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

	setbuf(stdin, NULL);

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

	fscanf(ultimoid, "%i", &clientes->id);
	clientes->id += 1;
	fclose(ultimoid);
	ultimoid = fopen("arquivos/ultimoid.txt", "r+");
	fprintf(ultimoid, "%i", clientes->id);

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

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

	rewind(arquivo);

	fscanf(arquivo, "%5i %20c %9i", &cad_id_res, cad_nome_res, &cad_telefone_res);

	printf("%05i %s %09i", cad_id_res, cad_nome_res, cad_telefone_res);

	printf("\nQual id a pesquisar: ");
	int id;
	scanf("%i", &id);
	printf("\n\n\n");

		rewind(arquivo);
		/*fseek(arquivo, i * 39, SEEK_SET);*/

	for (int i = 0; i < clientes->id; ++i)
	{
		fscanf(arquivo, "%5i %20c %9i", &cad_id_res, cad_nome_res, &cad_telefone_res);
		if (id == cad_id_res)
		{
			printf("%05i %s %09i\n", cad_id_res, cad_nome_res, cad_telefone_res);
			break;
		}
		else
		{
			printf("Nao encontrado %05i     ", i);
			printf("%05i %s %09i\n", cad_id_res, cad_nome_res, cad_telefone_res);
		}
	}

	fclose(arquivo);
	fclose(ultimoid);

	system("pause");
	return 0;
}

no arquivo de texto sai da maneira correta mas quando tento puxar n vai

00001 teste 23             312654978
00002 teste 2              312456987
00003 teste 3              789465123
00004 teste 4              789465132
00005 teste 5              987564123
00006 teste 6              123456798
00007 teste 7              789456123
00008 teste 8              231564789
00009 teste 9              123456789

"arquivo de texto"

Screenshot_4.png.77ac8c187537a14483b5c9f45547026b.png

 

o arquivo "ultimo id" e um simples arquivo que contem qual foi o ultimo id usado inicialmente ele começa com 0

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá @Gabriel Paulucci Então misteriosamente a unica coisa que fiz para foi endentar e inicializar as variáveis do sistema.

 

Veredicto: Funcional!

image.png.b5b2b63139ffffac7b65ad7ebe773a7f.png

Imagem Ilustrativa sujeita a exclusão

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Gabriel Paulucci Há srsr fiz apenas 1, vou copiar e testar de novo

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Gabriel Paulucci Evidente que acontece depois de 7 porque números octais ( de base 8 ) são até 7 nas unidades, ou seja, não existe octal 8 ou 9. Mas você me pergunta --- De onde vem a interpretação de octais? Vem do caractere de formatação "%i": esse caractere converte as bases para os bytes na memória com um princípio /ou / padrão de formatação de entrada. Assim sendo, quando os números vão acompanhados de 0000 na frente eles são convertidos para base 8, se vêm com 0x devem ser convertidos para base 16. É isso que significa "%i" o i-zinho vai convertendo as bases em (octal, decimal, hexadecimal) de acordo com o marcado no começo da entrada.  Esse i sozinho equivale a o d e x, ou seja, %i é o complexo de %o %d e %x.  Quando a função tenta converter 9 para base octal, ela falha porque 9 não existe em octalis, simplesmente. Daí como resultado ruim a função devolve emite 0 indicando que falhou.

 

Dadas as devidas explicações para resolver tudo basta que: 

substitui "i" por "d", com d de decimal.

 

Imagem Ilustrativa Sujeita a Exclusão

image.png.f2425c62441f395358d6d96b1d5ec909.png

 


18:25 Atualização

           Já está bem na hora de modular esse código, sua extensão pede o uso de funções.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro 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 publicações 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

×