2
respostas

[Dúvida] Como o compilador se localiza?

Na Aula 4 - StreamWriter e StreamReader foi apresentado os seguintes metodos:

using ByteBank_IO;
using System.Text;

partial class Program
{
    static void EscritaBinaria()
    {
        using (var fs = new FileStream("contaCorrente.txt", FileMode.Create))
        using (var escritor = new BinaryWriter(fs))
        {
            escritor.Write(456);           //número da Agência
            escritor.Write(546544);   //número da conta
            escritor.Write(4000.50); //Saldo
            escritor.Write("Gustavo Braga");
        }
    }
}
static void LeituraBinaria()
{
    using (var fs = new FileStream("contaCorrente.txt", FileMode.Open))
    using (var leitor = new BinaryReader(fs))
    {
        var agencia = leitor.ReadInt32();
        var numeroConta = leitor.ReadInt32();
        var saldo = leitor.ReadDouble();
        var titular = leitor.ReadString();
    }
}

Minha dúvida é: como o compilador sabe separar e sabe que eu colocar o conteúdo inteiro ("456") do arquivo binário na variável "agencia" e o segundo inteiro do arquivo ("546544") dentro da variável "numeroConta". Antes quando estava trabalhando com array isso é claro para mim pois sempre havia a referência do índice, mas agora trabalhando com o arquivo, como ele sabe?

2 respostas

Klayton,

Não tinha pensado nisto... fui procurar uma resposta e acho que entendi, vou explicar o que eu entendi:

  • O "BinaryWriter" grava por trechos de Bytes (leia-se: "codificação" e "tamanho") de acordo com o que você definir. A definição "default" é a UTF-8, mas pode ser alterado a seu gosto. Depois o "BinaryReader" trabalha no mesmo formato (exemplo: UTF-8) e se vira para trazer de volta a informação.

Por favor, leia os artigos abaixo e veja se você também entende assim também:

==========================================================

Introduction to C# BinaryReader

Como o BinaryReader funciona em C#?

Ao criar uma instância do BinaryReader, fornecemos fluxo para ler, podemos opcionalmente especificar a codificação de caracteres a ser usada se não especificarmos a codificação, por padrão, a codificação UTF-8 é usada. Junto com isso, podemos opcionalmente especificar se queremos que o fluxo seja aberto depois que o objeto de BinaryReader for descartado, conforme mostrado na instrução abaixo.

https://www.educba.com/c-sharp-binaryreader/

==========================================================

C# - Escrevendo e Lendo arquivos binários

José Carlos Macoratti

...

A classe BinaryReader lê tipos de dados primitivos como valores binários em uma codificação específica e a classe BinaryWriter grava tipos primitivos em binário em um fluxo e suporta cadeias de caracteres de escrita em uma codificação específica.(Um objeto BinaryWriter trabalha no nível mais baixo de Streams.)

A classe BinaryWriter é usada para escrever tipos primitivos como valores binários em um fluxo de codificação específica. Ela trabalha com objetos de fluxo que fornecem acesso aos bytes subjacentes. Para criar um objeto BinaryWriter, primeiro você tem que criar um objeto FileStream e depois passar o BinaryWriter ao método construtor.

Após criar os objetos é feita a leitura do arquivo origem em blocos de 1024 bytes escrevendo em seguida no destino. Esse processo é repetido até alcançar o final do arquivo.

A seguir vamos criar um projeto C# do tipo Console na plataforma .NET Core e mostrar isso na prática.

...

https://www.macoratti.net/20/04/c_binarq1.htm

==========================================================

Por favor, leia também:

==========================================================

Exemplo de StreamWriter em C#

Mahesh Chand Date Jun 15, 2019

O trecho de código a seguir cria um StreamWriter de um FileStream com codificação. As codificações suportadas são ASCII, Unicode, UTF32, UTF7 e UTF8. A codificação é definida no namespace System.Text.

using (StreamWriter writer = new StreamWriter(stream, Encoding.UTF32))

O trecho de código a seguir cria um StreamWriter de um FileStream com codificação e tamanho de buffer.

using (StreamWriter writer = new StreamWriter(stream, Encoding.UTF32, 512))

https://www.c-sharpcorner.com/article/csharp-streamwriter-example/

==========================================================

C# - Copiando Arquivos textos e binários

José Carlos Macoratti

Nota: Um stream pode ser considerado um fluxo sequêncial de bytes com um arquivo, um dispositivo de entrada/saida, um processo de comunicação entre dois pontos ou um socket TCP/IP. (Após esta explicação eu vou continuar a usar a palavra stream na sua forma original sem tradução.)

https://macoratti.net/13/08/c_copa1.htm

==========================================================

C# - Lendo e escrevendo em arquivos textos (StreamReader/StreamWriter)

José Carlos Macoratti

https://macoratti.net/14/04/c_iotb1.htm

==========================================================

C# FileStream, StreamWriter, StreamReader, TextWriter, TextReader

Last Updated:December 5, 2022

https://www.softwaretestinghelp.com/c-sharp/csharp-filestream-streamwriter-streamreader/

==========================================================

Agora tente aprender mais também sobre o formato UTF-8 e outros formatos:

==========================================================

UTF-8

...

UTF-8 usa de um a quatro bytes (estritamente, octetos) por caractere, ...

https://pt.wikipedia.org/wiki/UTF-8

==========================================================

O que é ASCII, UNICODE e UTF-8

Última modificação: 22 de outubro de 2020 às 16:50 por Natali Chiconi .

https://br.ccm.net/faq/9956-o-que-e-ascii-unicode-e-utf-8

==========================================================

O que é Unicode, UTF-8, UTF-16?

https://qastack.com.br/programming/2241348/what-is-unicode-utf-8-utf-16

==========================================================

Espero ter ajudado.

[]'s,

Fabio I.

O método Write escreve primeiro o número da agência (456) no arquivo binário, seguido pelo número da conta (546544), saldo (4000.50) e nome do titular ("Gustavo Braga"). Quando o método Read é chamado, ele lê os dados na mesma ordem, primeiro o número da agência, depois o número da conta e assim por diante. Como cada dado é lido em uma ordem específica, o compilador sabe qual dado atribuir à qual variável.

Se você alterar a ordem em que os dados são escritos no arquivo binário, o método Read não será capaz de identificar corretamente qual dado deve ser atribuído à qual variável. Isso resultará em valores incorretos sendo atribuídos às variáveis.

Ex: Apenas alterei a ordem do saldo(double).

static void LeituraBinaria()
    {
        using (var fs = new FileStream("contaCorrente.txt", FileMode.Open))
        using (var leitor = new BinaryReader(fs))
        {
            var saldo = leitor.ReadDouble();
            var agencia = leitor.ReadInt32();
            var numeroConta = leitor.ReadInt32();
            var titular = leitor.ReadString();

            Console.WriteLine($"{saldo}\n {agencia}\n {numeroConta}\n {titular}");
        }
    }
    saida: 
    1,159764067577549E-308
     0
     1085227264
     Gustavo Braga

Até a 2° variavel que é um inteiro, acabou sendo incorreto.