Fórum PiR2
Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.

Ajuda com leitura de arquivo

2 participantes

Ir para baixo

Ajuda com leitura de arquivo Empty Ajuda com leitura de arquivo

Mensagem por matossousa Dom 19 Nov 2017, 08: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
matossousa
matossousa
iniciante

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

Ir para o topo Ir para baixo

Ajuda com leitura de arquivo Empty Re: Ajuda com leitura de arquivo

Mensagem por Oruanovich Sab 06 Jan 2018, 06: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);
}
Oruanovich
Oruanovich
iniciante

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

Ir para o topo Ir para baixo

Ir para o topo


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