Ajuda com leitura de arquivo

Ir em baixo

Ajuda com leitura de arquivo

Mensagem por matossousa em Dom 19 Nov 2017, 09:41

Olá, tenho um exercício para resolver que consiste na criação de um programa em C que calcule em tempo real a pontuação de um jogo de boliche. Mas para esse exercício minha professora quer que os dados de entrada sejam obtidos por meio de um arquivo txt (para ela poder fazer testes nos programas mais rapidamente). O meu problema é que gostaria de colocar a leitura desses dados em uma matriz, só que o executar para de responder ou entra em loop com a maneira que eu fiz isso (parte vermelha).

#include

int le_numero_arquivo(FILE* fpin){
    int i;
    fscanf(fpin, "%d", &i);
    return i;
}

FILE* abre_arquivo(char* nome_arquivo){
    FILE *fpin;
    fpin=fopen(nome_arquivo, "r");
    if (fpin==NULL){
        printf("=> ERRO: Falha na abertura do arquivo\n\n");
        exit(-1);
    }
    return fpin;
}

void fecha_arquivo(FILE* fpin){
    fclose(fpin);
}

int main(){
    FILE* arquivo = abre_arquivo("nome.txt");
    int bola,p,b;
    p=b=1;
    int matriz[9][6];
    int vetor[12];


    while(!feof(arquivo)&&p<=9){
        bola= le_numero_arquivo(arquivo);
        if(b<=6){
            matriz[p][b]=bola;
            b++;
        }
        else{
            p++;
            b=1;
            matriz[p][b]=bola;
            b++;
        }
    }

    fecha_arquivo(arquivo);

    system("PAUSE");
    exit(0);
}

Estou testando com o seguinte txt:
3 3 10 0 2 4
10 0 10 0 5 5
10 0 10 0 2 1
5 5 10 0 0 0
10 0 10 0 10 0
2 7 10 0 0 10
8 0 10 0 1 0
2 1 10 0 2 4
6 3 10 0 6 3
avatar
matossousa
iniciante

Mensagens : 16
Data de inscrição : 14/04/2015
Idade : 18
Localização : Osasco, SP (Brasil)

Voltar ao Topo Ir em baixo

Re: Ajuda com leitura de arquivo

Mensagem por Oruanovich em Sab 06 Jan 2018, 07:59

Olá, provavelmente o prazo do trabalho terminou, mas eu vou responder, poderá te ajudar Very Happy.

O problema está na função feof, que verifica se o buffer(neste caso, o arquivo apontado por fpin) possui algum dado. E neste caso ele possui, pois você está lendo com a mascara "%d" que acaba não lendo caracteres brancos(' ', '/t', '/n'), devido a isso, o código cai em loop infinito. 

Para corrigir este problema, basta usar passagem por referência e o fato de fscanf retornar o numero de variáveis lidas.


#include
#include

/* Aqui eu passo o i como referencia(ele guardara o dado lido no arquivo) e depois retorno quantas variaveis 
   fcanf retornou 
*/

int le_numero_arquivo(FILE* fpin, int *i){
    return fscanf(fpin, "%d", i);

}

FILE* abre_arquivo(char *nome_arquivo){
    FILE *fpin;
    fpin=fopen(nome_arquivo, "r");
    if (fpin==NULL){
        printf("=> ERRO: Falha na abertura do arquivo\n\n");
        exit(-1);
    }
    return fpin;
}

void fecha_arquivo(FILE* fpin){
    fclose(fpin);
}

int main(){
    FILE* arquivo = abre_arquivo("nome.txt");
    int bola,p,b;
    p=b=1;
    int matriz[9][6];
    int vetor[12];

    /*Então, enquanto fscanf estiver retornando 1(lendo um dado) e p for ESTRIMENTE MENOR QUE 9(cuidado 
com os limites) eu rodo o loop
   */
    while(le_numero_arquivo(arquivo, &bola) == 1 && p < 9){

        if(b < 6){
            matriz[p][b]=bola;
            b++;
        }
        else{
            p++;
            b=1;
            if(p < 9) matriz[p][b]=bola; //cuidado com os limites
            b++;
        }
        fecha_arquivo(arquivo);

        //system("PAUSE");   Mude para linux!!!
        //exit(0);

        return (EXIT_SUCCESS);
}
avatar
Oruanovich
iniciante

Mensagens : 9
Data de inscrição : 30/05/2014
Idade : 22
Localização : São Carlos, São Paulo e Brasil

Voltar ao Topo Ir em baixo

Voltar ao Topo

- Tópicos similares

 
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum