1
resposta

[Sugestão] Solução para a Impressão "estranha" da Matriz do arquivo mapa.txt

Olá!

Como vi várias perguntas a respeito e ainda nenhuma resposta, segue a dedução que fiz.

O código abaixo, na primeira passada do loop, para i = 0:

for (int i = 0; i < 5; i++){ printf("%s\n", mapa[i]); }

imprime: |--------||...|..-.||..-|.@..||......-.||--------|

Ou seja, tudo que está a partir da posição de memória apontada por mapa[0] .

Para i = 1, imprime: |...|..-.||..-|.@..||......-.||--------| Ou seja, tudo que está a partir da posição de memória apontada por mapa[1] . E assim sucessivamente. No final do loop, temos:

|--------||...|..-.||..-|.@..||......-.||--------| [quebra] |...|..-.||..-|.@..||......-.||--------| [quebra] |..-|.@..||......-.||--------| [quebra] |......-.||--------| [quebra] |--------| [quebra]

Percebam que na leitura do arquivo não foi encontrada nenhuma quebra de linha, e assim na primeira iteração do loop a leitura foi completa, como se tudo estivesse na primeira linha. Já na segunda iteração, como o ponteiro do leitor de arquivo se posiciona no início da segunda linha, ele lê as quatro linhas seguintes como se as 4 últimas linhas estivessem em uma única linha.

Por que isso acontece? Quando criamos o arquivo mapa.txt, copiamos e colamos os caracteres a partir da página da Alura, e lá não existe o caractere de quebra de linha. Assim, o fscanf por não encontrar a quebra de linha lê tudo, até o fim do arquivo, e armazena tudo a partir da posição de memória apontada por mapa[0]. Na segunda iteração, a leitura é a partir da segunda linha, e o armazenamento é apartir da posição apontada por mapa[1]. O intervalo entre mapa[0] e mapa[1] é mantido na memória, mas o intervalo entre mapa[1] e mapa[4] é sobrescrito na memória, e assim sucessivamente.

Se manualmente dermos um enter linha a linha no arquivo mapa.txt, e depois salvarmos o arquivo, inserimos a quebra de linha, lida pelo \n. Após fazermos isso, a impressão aparece conforme no vídeo, pois cada posição de memória apontada por mapa[i] encontra o \n e armazena naquele pedaço da memória apenas a linha correspondente.

|--------| [quebra] |...|..-.| [quebra] |..-|.@..| [quebra] |......-.| [quebra] |--------| [quebra]

1 resposta

Olá Fábio!

Obrigada por compartilhar sua dedução sobre a impressão "estranha" da matriz do arquivo mapa.txt. Realmente, quando não há quebras de linha no arquivo, o fscanf lê tudo até o fim do arquivo e armazena tudo a partir da posição de memória apontada por mapa[0]. Nas iterações seguintes, a leitura é feita a partir das linhas seguintes, e o armazenamento é feito a partir das posições apontadas por mapa[1], mapa[2], e assim por diante. Isso faz com que as linhas subsequentes pareçam estar concatenadas em uma única linha.

Uma solução para esse problema é adicionar manualmente as quebras de linha no arquivo mapa.txt, inserindo um enter linha a linha e salvando o arquivo. Dessa forma, o \n será lido pelo fscanf e cada posição de memória apontada por mapa[i] armazenará apenas a linha correspondente.

Por exemplo, se o arquivo mapa.txt estiver assim:

|--------|
|...|..-.|
|..-|.@..|
|......-.|
|--------|

A impressão será conforme o esperado:

|--------|
|...|..-.|
|..-|.@..|
|......-.|
|--------|

Espero que essa solução ajude a resolver o problema da impressão "estranha" da matriz. Se tiver mais alguma dúvida, é só me dizer!

Espero ter ajudado e bons estudos!