Ir para o conteúdo
nunolevezinho

Erro ao ler ficheiro de texto

Mensagens Recomendadas

nunolevezinho



#define N_LINHAS 6
#define N_COLUNAS 7
#define MAX_JOGADAS 10
#define STRING_MAX_SIZE 100
#define MAX_NUMBER_STRINGS 1000

/* Variáveis Globais */
FILE *ficheiro_jogadores;
FILE *ficheiro_pontuacoes;
char jogador1[100], jogador2[100], pontuacao1[10], pontuacao2[10];

------- codigo ------

void GetInfoJogadores(FILE *ficheiro_jogadores)
{
char storage[MAX_NUMBER_STRINGS][sTRING_MAX_SIZE];
int storage_size = 0;

  /* abre o ficheiro */
  ficheiro_jogadores = fopen("jogadores.txt", "r");
  if (ficheiro_jogadores == NULL) {
	 printf("Não conseguiu abrir jogadores.txt para leitura.\n");
  }

  //Verifica se o ficheiro está vazio
  fseek (ficheiro_jogadores, 0, SEEK_END);
  printf("LETRAS: %d", ftell(ficheiro_jogadores));
  if(ftell(ficheiro_jogadores) > 0)
  {
printf("maior");
//Verifica o nome dos jogadores
//apresenta a primeira palavra de cada linha do ficheiro
erro aqui --- while (storage_size < MAX_NUMBER_STRINGS &&						 // enquanto houver espaço para guardar
 fgets(storage[storage_size], STRING_MAX_SIZE, ficheiro_jogadores))		 // ler a entrada
  {
 storage[storage_size][strlen(storage[storage_size]) - 1] = '\0';  // remover o '\n' final da linha lido pelo fgets
 storage_size++;			 // incrementar o número de elementos guardados
}
/* fecha o ficheiro */
fclose(ficheiro_jogadores);
strcpy(jogador1, storage[0]);
strcpy(jogador2, storage[1]);
}
  else
  {
printf("menor");
printf("Configuracao Inicial\nIntroduza nome dos jogadores: ");
scanf("%s", jogador1);
scanf("%s", jogador2);
ficheiro_jogadores = fopen("jogadores.txt", "w");
fprintf(ficheiro_jogadores, "%s\n%s\n", jogador1, jogador2);
fclose(ficheiro_jogadores);
GetInfoJogadores(ficheiro_jogadores);
  }
}


void main()
{
/* Declaração de Variáveis */
int jogador_actual, n_linhas, n_colunas, n_jogadas, n_jogadores, configs;
char tabuleiro[N_LINHAS][N_COLUNAS], opcao;

/* Inicialização das Variáveis */
n_linhas = N_LINHAS;
n_colunas = N_COLUNAS;
n_jogadores = 2;
jogador_actual = 1;
n_jogadas = 0;

GetInfoJogadores(ficheiro_jogadores);

--- palha ---

}

O programa simplesmente abre e fecha imediatamente, não da erro de compilação nenhum.

Esta função é suposto verificar se o ficheiro de texto está vazio, se estiver, pede o nome dos jogadores ao utilizador, caso contrario percorrer o ficheiro e guarda o nome dos jogadores em 2 variaveis.

Editado por nunolevezinho

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

O programa simplesmente abre e fecha imediatamente, não da erro de compilação nenhum.

a aplicação começa com a execução da função main, função que não apresentaste

ps : já agora, mandaste o ponteiro interno do stream ficheiro para o fim, e tentas ler dados logo a seguir.

Editado por HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
nunolevezinho

Já coloquei a função main.

Pelo que me parece agora já funciona.

void GetInfoJogadores(FILE *ficheiro_jogadores)
{
char storage[MAX_NUMBER_STRINGS][sTRING_MAX_SIZE];
int storage_size = 0;

  /* abre o ficheiro */
  ficheiro_jogadores = fopen("jogadores.txt", "r");
  if (ficheiro_jogadores == NULL) {
	 printf("Não conseguiu abrir jogadores.txt para leitura.\n");
  }

  //Verifica se o ficheiro está vazio
  fseek (ficheiro_jogadores, 0, SEEK_END);
  printf("LETRAS: %d", ftell(ficheiro_jogadores));
  if(ftell(ficheiro_jogadores) > 0)
  {
   printf("maior");
   ficheiro_jogadores = fopen("jogadores.txt", "r");
   //Verifica o nome dos jogadores
   //apresenta a primeira palavra de cada linha do ficheiro
   while (storage_size < MAX_NUMBER_STRINGS &&						 // enquanto houver espaço para guardar
 fgets(storage[storage_size], STRING_MAX_SIZE, ficheiro_jogadores))		 // ler a entrada
  {
 storage[storage_size][strlen(storage[storage_size]) - 1] = '\0';  // remover o '\n' final da linha lido pelo fgets
 storage_size++;			 // incrementar o número de elementos guardados
   }
   /* fecha o ficheiro */
   fclose(ficheiro_jogadores);
   strcpy(jogador1, storage[0]);
   strcpy(jogador2, storage[1]);
   }
  else
  {
   printf("menor");
   fclose(ficheiro_jogadores);
   printf("Configuracao Inicial\nIntroduza nome dos jogadores: ");
   scanf("%s", jogador1);
   scanf("%s", jogador2);
   ficheiro_jogadores = fopen("jogadores.txt", "w");
   fprintf(ficheiro_jogadores, "%s\n%s\n", jogador1, jogador2);
   fclose(ficheiro_jogadores);
   GetInfoJogadores(ficheiro_jogadores);
  }

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

já agora, mandaste o ponteiro interno do stream ficheiro para o fim, e tentas ler dados logo a seguir.

não sei de onde tiraste a ideia de abrir novamente um ficheiro que já se encontra aberto


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
nunolevezinho

Eu percebi que já se encontra aberto, mas por alguma razão, se não o voltar abrir assim que entro no while, o programa da erro, se meter já não dá e aparentemente "funciona".

Não percebi o queres dizer com o ponteiro interno do stream ficheiro, ainda não dei esta matéria não estou muito a vontade com este tema

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

Não percebi o queres dizer com o ponteiro interno do stream ficheiro, ainda não dei esta matéria não estou muito a vontade com este tema

eu é que não percebo essa afirmação de uma pessoa que apresenta um código onde usa correctamente as funções fseek e ftell ...

troca a abertura do ficheiro por:

fseek (ficheiro_jogadores, 0, SEEK_SET);


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
nunolevezinho

Procurei no google .. estou a tentar aprender por mim, mas quando nao sei tenho de pesquisar

Meti como disseste, mas agora está sempre a pedir-me para inserir o nome dos utilizadores, quer o ficheiro esteja vazio ou não.

Editado por nunolevezinho

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

espero que tenhas colocado/trocado no local onde meteste a segunda abertura do ficheiro.

coloca o código que tens agora


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
nunolevezinho

void GetInfoJogadores(FILE *ficheiro_jogadores)
{
char storage[MAX_NUMBER_STRINGS][sTRING_MAX_SIZE];
int storage_size = 0;
  /* abre o ficheiro */
  ficheiro_jogadores = fopen("jogadores.txt", "r");
  if (ficheiro_jogadores == NULL) {
	 printf("Não conseguiu abrir jogadores.txt para leitura.\n");
  }
  //Verifica se o ficheiro está vazio
  fseek (ficheiro_jogadores, 0, SEEK_SET);
  if(ftell(ficheiro_jogadores) > 0)
  {
//ficheiro_jogadores = fopen("jogadores.txt", "r");
//Verifica o nome dos jogadores
//apresenta a primeira palavra de cada linha do ficheiro
while (storage_size < MAX_NUMBER_STRINGS &&						 // enquanto houver espaço para guardar
 fgets(storage[storage_size], STRING_MAX_SIZE, ficheiro_jogadores))		 // ler a entrada
{
 storage[storage_size][strlen(storage[storage_size]) - 1] = '\0';  // remover o '\n' final da linha lido pelo fgets
 storage_size++;			 // incrementar o número de elementos guardados
}
/* fecha o ficheiro */
fclose(ficheiro_jogadores);
strcpy(jogador1, storage[0]);
strcpy(jogador2, storage[1]);
}
  else
  {
fclose(ficheiro_jogadores);
printf("Configuracao Inicial\nIntroduza nome dos jogadores: ");
scanf("%s", jogador1);
scanf("%s", jogador2);
ficheiro_jogadores = fopen("jogadores.txt", "w");
fprintf(ficheiro_jogadores, "%s\n%s\n", jogador1, jogador2);
fclose(ficheiro_jogadores);
GetInfoJogadores(ficheiro_jogadores);
  }
}

Edit: agora sim está como tenho

Pelo que me parece, ao fazer como disseste, o ftell da sempre 0 por isso está sempre a pedir para meter os nomes dos jogadores.

Não meti o fseek no sitio certo correcto?

Editado por nunolevezinho

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

código do primeiro post :

 //Verifica se o ficheiro está vazio
 fseek (ficheiro_jogadores, 0, SEEK_END);
 printf("LETRAS: %d", ftell(ficheiro_jogadores));
 if(ftell(ficheiro_jogadores) > 0)
 {
   printf("maior");

código alterado no segundo post :

 //Verifica se o ficheiro está vazio
 fseek (ficheiro_jogadores, 0, SEEK_END);
 printf("LETRAS: %d", ftell(ficheiro_jogadores));
 if(ftell(ficheiro_jogadores) > 0)
 {
   printf("maior");
   ficheiro_jogadores = fopen("jogadores.txt", "r"); // <--------------- isto apareceu

não sei de onde tiraste a ideia de abrir novamente um ficheiro que já se encontra aberto

troca a abertura do ficheiro por:

fseek (ficheiro_jogadores, 0, SEEK_SET);

ultimo código apresentado :

 //Verifica se o ficheiro está vazio
 fseek (ficheiro_jogadores, 0, SEEK_SET); // <-------- isto é uma abertura do ficheiro ?
 if(ftell(ficheiro_jogadores) > 0)
 {
   //ficheiro_jogadores = fopen("jogadores.txt", "r");


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
nunolevezinho

Ah, ok acho que ja percebi, a função fseek é para colocar o ponteiro do ficheiro onde quero certo?

Já meti, após abrir o while e agora parece-me estar bem.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.