Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Bug] Fluxo de arquivos sendo lido duas vezes, e em algumas linhas, não realiza quebras

Salve galerinha, espero que estejam bem!

Se alguém puder me dar uma luz, estou realizando as aulas do C# trabalhando com arquivos, e ao fim do primeiro módulo e começo do segundo, fiz a função de leitura de buffer em string, porém, estão rolando dois pequenos bugs, onde as informações são lidas 2x, sendo que há apenas 1 Console.Write para as informações em questão, e além disso, em alguns momentos, a aplicação não está quebrando linhas, mas no arquivo utilizado, ele está ok.

Segue abaixo o código que estou rodando:

using System.IO;
using System.Text;
using ByteBankIO;

string caminhoArquivo = "./contas.txt";

try{
    // BytesLidos é o número de bytes lidos do arquivo (definido como -1 para indicar que não houve leitura)
    int bytesLidos = -1;

    //Buffer
    var buffer = new byte[1024]; // 1KB

    // Cria o arquivo caso não exista
    var fluxoArquivo = new FileStream(caminhoArquivo, FileMode.Open);

    while(bytesLidos != 0){
        //Lê o arquivo usando o buffer (que é um array de bytes), lendo a cada 1024 bytes / 1KB
        bytesLidos = fluxoArquivo.Read(buffer, 0, 1024);
    
        //Escreve o buffer na tela
        WriteBuffer(buffer);
    }

    // Fecha o fluxo de arquivo após a leitura completa 
    if (bytesLidos == 0){
        fluxoArquivo.Close();
    }

}
catch (Exception ex){
    Console.WriteLine($"Ocorreu uma exceção do tipo {ex.GetType()}.\nMensagem: {ex.Message}");
}

static void WriteBuffer(byte[] buffer){
    // Cria uma instância de UTF8Encoding para converter o buffer em string
    var utf = new UTF8Encoding();

    // Converte o buffer em string e escreve na tela
    var texto = utf.GetString(buffer);
    Console.Write(texto);

    //Aguarda 500ms para evitar que o console fique muito rápido
    Thread.Sleep(500);
}

Ambiente:

  • Versão .NET 9.0
  • Windows 11
  • MS VS 17.13.5

Evidências:

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

2 respostas
solução!

O problema está no seu uso do buffer. Você está sempre imprimindo os 1024 bytes do array, mesmo quando a leitura retorna menos bytes. Isso faz com que dados anteriores se repitam ou vazamento de lixo de memória apareça, dando uma impressão de duplicação. Isso também afeta a quebra de linha, por que pode estar imprimindo trechos incompletos ou juntando partes que não deveriam estar juntas.

Use o número de bytes lidos no WriteBuffer para converter apenas o que foi realmente lido

static void WriteBuffer(byte[] buffer, int bytesLidos)
{
    var utf = new UTF8Encoding();
    var texto = utf.GetString(buffer, 0, bytesLidos);
    Console.Write(texto);
    Thread.Sleep(500);
}

Aí na leitura vc faz

using (var fluxoArquivo = new FileStream(caminhoArquivo, FileMode.Open))
{
    while ((bytesLidos = fluxoArquivo.Read(buffer, 0, buffer.Length)) > 0)
    {
        WriteBuffer(buffer, bytesLidos);
    }
}

Isso resolve os dois bugs.

Obrigado Patrick! Apenas a primeira parte do código foi necessária e já resolveu ambos os bugs. :D