Ir ao conteúdo
  • Cadastre-se
Luiz Felipe Santos

Problema em leitura de arquivo - c

Recommended Posts

Boa noite, pessoal

 

Complicado começar no fórum assim, mas passei a tarde toda em cima desse código, meus colegas tentaram me ajudar e nada. Espero que possam me ajudar.

 

Eu preciso acessar o arquivo arq.dat e ler o que está contido nele, o que consegui fazer nessa primeira parte do código (que descobre quantos times estão no arquivo). Na segunda parte, eu precisaria alocar memória e salvar as informações do arquivo, ali que surge o problema: o fread() não funciona.

 

Conseguem ver onde é o problema?

 

Se puderem me ajudar, agradeço!

times_t *le_times(const char *arquivo, unsigned int *numero_de_times){
	int i, j, teste, temp, testa, x;
	FILE *ptr;
	ptr=abre_arquivo("arq.dat");
	rewind(ptr);
	times_t descobre;	

		//descobre o numero de times no arquivo
		for (i=1; i>=0; i++){	
			teste = fread(&descobre,sizeof(descobre),1, ptr);
			//printf("%i\n", teste);
			if (teste != 1){
				temp = i-1;
				break;
			}
		}
	
		//aloca memoria e le o numero de times - TÁ DANDO PAU AQUI
		times_t *le = (times_t *) malloc(sizeof(times_t));
			testa = fread(&le[0], sizeof(times_t), 1, ptr);	
			printf("%i\n", testa);
		for (j=1; j<temp; j++){
			le = (times_t *) realloc(le, (j+1)*sizeof(times_t) );
			testa = fread(&le[j], sizeof(times_t), 1, ptr);
			if(testa != 0){
				printf("Teste\n");
			}
		}
	return temp;
}

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

mais importante que nos mostrar a forma com a que você está lendo o arquivo é mostrar como você está salvando os dados no arquivo

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@vangodp O arquivo já estava pronto, é binário, não preciso alterar ele.

 

A struct t_times contém isso daqui

 

typedef struct {
	char nome[TAM_NOME];
	//0 goleiro, 1 zagueiro, 2 lateral, 3 volante, 4 meio, 5 atacante
	unsigned int posicao; 
	unsigned int gols_marcados;
	unsigned int bolas_roubadas;
	unsigned int numero_jogos;
	unsigned int finalizoes_certas;
	unsigned int finalizoes_erradas;
	unsigned int faltas_recebidas;
	unsigned int faltas_cometidas;
	unsigned int cartoes_vermelhos;
	unsigned int cartoes_amarelos;
	unsigned int penalti_defendidos;
	unsigned int defesas;
} jogador_t;

typedef struct {
	char nome[TAM_NOME];
	char estado[3];
	unsigned int dia_fundacao;
	unsigned int mes_fundacao;
	unsigned int ano_fundacao;
	unsigned int numero_tit_brasileiros;
	unsigned int numero_copas_brasil;
	unsigned int numero_tit_libertadores;
	unsigned int numero_tit_estadual;
	jogador_t jogadores[NUM_JOGADORES];
} times_t;

 

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

primeiro que vejo errado é a forma com a que você está abrindo o arquivo
.Se o arquivo é binário deve ser aberto como ptr=abre_arquivo("arq.dat", "r+b"); para leitura.

adicionado 8 minutos depois

que tamanho tem TAM_NOME? =/

 

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites
10 minutos atrás, vangodp disse:

primeiro que vejo errado é a forma com a que você está abrindo o arquivo
.Se o arquivo é binário deve ser aberto como ptr=abre_arquivo("arq.dat", "r+b"); para leitura.

adicionado 8 minutos depois

que tamanho tem TAM_NOME? =/

 

TAM_NOME tem 50 e NUM_JOGADORES tem 21

Compartilhar este post


Link para o post
Compartilhar em outros sites
1 minuto atrás, vangodp disse:

O que contêm esse arquivo? Simples estruturas times_t?

 

Sim, são 10 times com 21 jogadores cada

 

Os nomes são bem estranhos e os dados podem não fazer sentido porque foram gerados aleatoriamente pelo professor

Compartilhar este post


Link para o post
Compartilhar em outros sites
#include<stdio.h>
#include <stdlib.h>

#define TAM_NOME 50 
#define NUM_JOGADORES 21
 
typedef struct {
    char nome[TAM_NOME]; //0 goleiro, 1 zagueiro, 2 lateral, 3 volante, 4 meio, 5 atacante
    unsigned int posicao;
    unsigned int gols_marcados;
    unsigned int bolas_roubadas;
    unsigned int numero_jogos;
    unsigned int finalizoes_certas;
    unsigned int finalizoes_erradas;
    unsigned int faltas_recebidas;
    unsigned int faltas_cometidas;
    unsigned int cartoes_vermelhos;
    unsigned int cartoes_amarelos;
    unsigned int penalti_defendidos;
    unsigned int defesas;
} jogador_t;

typedef struct {
    char nome[TAM_NOME];
    char estado[3];
    unsigned int dia_fundacao;
    unsigned int mes_fundacao;
    unsigned int ano_fundacao;
    unsigned int numero_tit_brasileiros;
    unsigned int numero_copas_brasil;
    unsigned int numero_tit_libertadores;
    unsigned int numero_tit_estadual;
    jogador_t jogadores[NUM_JOGADORES];
} times_t;

void le_times () {
    int i, j, teste, temp, testa, x;
    times_t *lista;
    FILE *ptr = fopen( "arq.dat", "rb" );
    times_t descobre;
    
    
    //descobre o numero de times no arquivo
    for ( i = 0, teste = 0;  fread ( &descobre, sizeof ( descobre ), 1, ptr ) != 0; i++ ); // i é o numero de times que está no arquivo
    
    printf ( "Numero de times %d\n", i );
    
    //Se leu ao menos 1 ou mais times
    if ( i != 0 ) {
        //reservamos memoria para i numero de times    
        lista = ( times_t * ) malloc ( sizeof ( times_t ) * i );
        
        //Devemos retroceder ao principio do arquivo novamente para ler novamente os times
        rewind ( ptr );
        fread ( lista, sizeof ( times_t ), i, ptr );
        
        //aqui uma pequena prova de que leu corretamente... mostramos os nomes dos 10 times.
        for ( j = 0; j < i; j++ ) {
            printf ( "Time %d: %s\n", j+1, lista[j].nome );
        }
        
    }
    
    free(lista); //liberamos memoria.
    fclose(ptr); //Liberamos o ponteiro ao arquivo.
    
}

int main() {
    le_times();
    
    return 0;
}

Não estou muito seguro do que você quer mas deixo ai a forma de contar os times do arquivo e alocar memória dinâmica para eles. Falta você adapta-lo ao seu propósito.

  • Curtir 1

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

×