Ir ao conteúdo
  • Cadastre-se

Problema com leitura de arquivo em c.


claudiogc

Posts recomendados

Boa noite!

Queria fazer um programa que lê um arquivo de texto no formato abaixo e transforma os números lidos em inteiros, mas o meu programa, quando roda, dá bug. No momento estou usando Windows 7 apesar de no meu perfil esteja escrito Debian.

 

Formato do arquivo:

 

 

robgeek //nome do usuario
0 // representa os pontos vai de 0 ate 99
000000 // valores entre 0 e 1
000000 // idem
000000 // idem
000000 // idem
000000 // idem
000000 // idem

 

Código c: É a primeira parte, ainda não fiz a parte que muda de char para int.

#include <stdio.h> int main( ) {   FILE *arq = fopen("savegame.txt", "r");   char carac;   char nome[10];   char pontos[2];   char historico[6];   int i, linha = 1;      if( arq ) {      while( !feof( arq ) ) {         i = 0;          if(linha == 1) {            while((carac = fgetc( arq )) != '\n') {               nome[i] = carac;               i++;            }            printf("\nNa linha %d = %s",linha, nome);         }         else if(linha == 2) {            while((carac = fgetc( arq )) != '\n') {               printf("(%c)", carac);               pontos[i] = carac;               i++;            }            printf("\nNa linha %d = %s",linha, pontos);         }         else {            while((carac = fgetc( arq )) != '\n') {               historico[i] = carac;               i++;            }            printf("\nNa linha %d = %s",linha, historico);         }          linha++;      }       fclose( arq );   }   else {      printf("\nArquivo NAO existe.\n");   }    return 0;}

Saída dando bug:

robgeek<0>
0örobgeek
000000örobgeek
000000örobgeek
000000örobgeek
000000örobgeek
000000örobgeek
000000örobgeek

 

Como eu resolvo este problema?

Link para o comentário
Compartilhar em outros sites

         if(linha == 1) {            while((carac = fgetc( arq )) != '\n') {               nome[i] = carac;               i++;            }            nome[i] = '\0';            printf("\nNa linha %d = %s",linha, nome);         }

 

Quando você manda uma string pro printf, o C não sabe o tamanho exato dela, então ele imprime os caracteres até achar um '\0', que marca o fim da string.

Se você mandar uma string pro printf e ela não tiver esse marcador, o printf fica em loop e trava seu programa.

 

Coloquei um '\0' alí depois do primeiro while, pra demonstrar. Mas você precisa fazer o mesmo pra 'pontos[]' e pra 'historico[]'.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@claudiogc

 

 

 

Amigo, dei uma ajeitada no seu código. Dê uma olhada.

 

 

Mas não faria dessa forma, em absoluto; eu leria as linhas com fgets (isso em C) e faria a disposição dos laços de outra forma.

 

 

Como já comentado, você precisava terminar as strings e também aumentar o espaço alocado para elas. Veja, você declara um array de tamanho 6. A sua linha já tem 6 caracteres e precisaria do terminador, portanto, tamanho total de 7. Não seja tão econômico. :)

 

 

Ao final, você precisava verificar também se o fim de arquivo foi alcançado. Do jeito como estava, iria entrar num loop, já que esse valor seria testado e seria diferente de '\n'. O mesmo problema ocorre com os laços anteriores.. tem que corrigir isso.

#include <stdio.h>int main(){    FILE *arq = fopen("savegame.txt", "r");    char carac;    char nome[25];    char pontos[4];    char historico[10];    int i, linha = 1;    if( arq )    {        while( !feof( arq ) )        {            i = 0;            if(linha == 1)            {                while((carac = fgetc( arq )) != '\n')                {                    nome[i] = carac;                    i++;                }                nome[i] = 0;                printf("\nNa linha %d = %s",linha, nome);            }            else if(linha == 2)            {                while((carac = fgetc( arq )) != '\n')                {                    pontos[i] = carac;                    i++;                }                pontos[i] = 0;                printf("\nNa linha %d = %s",linha, pontos);            }            else            {                while(  ((carac = fgetc( arq )) != EOF) && ((carac != '\n') ))                {                    historico[i] = carac;                    i++;                }                historico[i] = 0;                printf("\nNa linha %d = %s",linha, historico);            }            linha++;        }        fclose( arq );    }    else    {        printf("\nArquivo NAO existe.\n");    }    return 0;}

:natal:

LNW

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...