Jump to content

Erro ao ler ficheiro de texto


nunolevezinho

Recommended Posts



#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.

Edited by nunolevezinho
Link to comment
Share on other sites

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.

Edited by HappyHippyHippo
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

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);
  }
Link to comment
Share on other sites

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

Link to comment
Share on other sites

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
Link to comment
Share on other sites

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?

Edited by nunolevezinho
Link to comment
Share on other sites

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
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.