Jump to content
nunolevezinho

Erro ao ler ficheiro de texto

Recommended Posts

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.

Edited by nunolevezinho

Share this post


Link to post
Share on other 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.

Edited by HappyHippyHippo

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

Share this post


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

Share this post


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

Share this post


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

Share this post


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

Share this post


Link to post
Share on other 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.

Edited by nunolevezinho

Share this post


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

Share this post


Link to post
Share on other 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?

Edited by nunolevezinho

Share this post


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

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • 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.