3
respostas

Como é diferenciado o número da conta e o da agência?

Boa tarde!

O arquivo foi escrito utilizando o comando Write, que não executa uma quebra de linha mas apenas avança o fluxo, então como o Reader é capaz de identificar que dois blocos tipo Int32 adjacentes não são uma coisa só?

A documentação diz que:

Write(Int32)    
Grava um inteiro com sinal de quatro bytes no fluxo atual e avança a posição do fluxo em quatro bytes.

Esse avanço ao qual se refere seria de quatro bytes vazios adicionados após os quatro bytes do inteiro (totalizando 8 bytes)?

3 respostas

Lucas,

Baseia-se em uma determinada ordem constante (depois de determinada pelo programador, sempre será assim até o programador mudar). Exemplo de ordem:

  1. Número,
  2. Agência,
  3. Saldo,
  4. Titular,

Linhas exemplo baseado no que foi combinando acima:

  • 375,4644,2483.13,Jonatan Silva
  • 234,4020,2822.52,Debora
  • 316,3254,3350.37,Leonardo

Então ele lê uma linha. (a separação de linhas se dá pelo char(13) - CR = Carriage Return e char(13) - LF = Line Feed.)

Separou a linha, okay... agora dentro da linha existe um lance chamado "comma-separated values (CSV)" que nada mais são que valores separados por vírgula. Desta forma o programa sabe onde começa e onde termina um determinado valor.

Aprenda mais! Leia os artigo que eu separei para você abaixo... é rapidinho!

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

CHAR (Transact-SQL)

Artigo - 07/06/2022 - 5 minutos para o fim da leitura

Caractere de controleValor
Tabchar(9)
Alimentação de linhachar(10)
Retorno de carrochar(13)

https://docs.microsoft.com/pt-br/sql/t-sql/functions/char-transact-sql?view=sql-server-ver16

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

CRLF

  • CR = Carriage Return ( \r, 0x0Dem hexadecimal, 13 em decimal) — move o cursor para o início da linha sem avançar para a próxima linha.
  • LF = Line Feed ( \n, 0x0Aem hexadecimal, 10 em decimal) — move o cursor para baixo para a próxima linha sem retornar ao início da linha.

https://developer.mozilla.org/en-US/docs/Glossary/CRLF

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

FileStream Class

https://docs.microsoft.com/en-us/dotnet/api/system.io.filestream?view=net-6.0

FileStream Classe

https://docs.microsoft.com/pt-br/dotnet/api/system.io.filestream?view=net-6.0

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

Ahhh! Tem mais uma coisa! Você pode usar o comando SPLIT para pegar os valores separados por vírgula e jogar dentro de uma array, por exemplo. Na verdade você pode usar qualquer tipo de separação, exemplo: ponto e vírgula, pipe, barra invertida, etc... mas o padrão para arquivos com extensão ".CSV", é como a própria extensão do arquivo diz, a vírgula. No exemplo abaixo, a variável "delimiterChars" compõe várias formas de quebrar os campos. Veja:

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

Como separar cadeias de caracteres usando String.Split em C #

char[] delimiterChars = { ' ', ',', '.', ':', '\t' };

string text = "one\ttwo three:four,five six seven";
System.Console.WriteLine($"Original text: '{text}'");

string[] words = text.Split(delimiterChars);
System.Console.WriteLine($"{words.Length} words in text:");

foreach (var word in words)
{
    System.Console.WriteLine($"<{word}>");
}

https://docs.microsoft.com/pt-br/dotnet/csharp/how-to/parse-strings-using-split

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

Espero ter sanado sua dúvida!

[]'s,

Fabio I.

Boa tarde, Fabio! Obrigado pela resposta.

Acontece que no caso do vídeo, ele não está separando os valores por vírgula, mas sim usando os seguintes comandos (retirados da transcrição da aula):

static void EscritaBinaria()
        { 
            using (var fs = new FileStream("contaCorrente.txt", FileMode.Create))
            using (var escritor = BinaryWriter(fs))
            {
                escritor.Write(456);//número da Agência
                escritor.Write(546544);//número da conta
                escritor.Write(4000.5o;)//Saldo
                escritor.Write("Gustavo Braga");
            }
        }

Ou seja, está escrevendo através do comando Write, não WriteLine, ou seja, sem quebra de linha, o que deveria sair 4565465444000.5Gustavo Braga

Depois ele está usando os seguintes comandos para leitura:

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(); 

                }
        }

A dúvida é: Como a leitura consegue identificar que os dois blocos int32 adjacentes e sem separação por vírgula (agencia e numeroConta) não são um bloco só.

Lucas,

Espera ai... não é bem assim...

Olhando dentro do arquivo "contaCorrente.txt" com o "bloco de notas", apareceu isto:

È  ðV      A¯@
Gustavo Braga

Se você mandar o "Notepad++" abrir o arquivo verá:

Aberto pelo Notepad++

Veja que tem mais coisas aê, não é "texto puro"... parece que ele gerencia gravando algum padrão que você determinar, por exemplo UTF-8. E a função sabe onde termina e começa uma nova variável.

Não sei exatamente como, mas é usado por vários programas e pode também ser usado no TCP/IP. Hum... isso é muito interessante!

Por favor, leia os Links abaixo:

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

BinaryWriter Classe

https://docs.microsoft.com/pt-br/dotnet/api/system.io.binarywriter?view=net-6.0

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

Escrevendo e Lendo Arquivo Binário em C#

https://denmartins.wordpress.com/2009/11/03/escrevendo-e-lendo-arquivo-binario-em-c/

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

O que é um arquivo DAT (e como faço para abrir um)?

...

Resumindo, um arquivo DAT contém informações importantes para o software manipular. As informações contidas em um arquivo DAT geralmente são texto simples ou binárias, embora em casos raros você possa encontrá-las como os dados reais de um arquivo de vídeo para programas como VCDGear ou CyberLink PowerDirector.

...

https://maisgeek.com/o-que-e-um-arquivo-dat-e-como-faco-para-abrir-um/

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

Stream Classe

Stream é a classe base abstrata de todos os fluxos. Um fluxo é uma abstração de uma sequência de bytes, como um arquivo, um dispositivo de arquivos entrada/saída, um pipe de comunicação de inter- processo, ou um soquete TCP/IP.

...

https://docs.microsoft.com/pt-br/dotnet/api/system.io.stream?view=net-6.0

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

BinaryWriter Construtores

https://docs.microsoft.com/pt-br/dotnet/api/system.io.binarywriter.-ctor?view=net-6.0

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

Como ler e gravar em um arquivo de dados recém-criado

Artigo - 06/04/2022 - 2 minutos para o fim da leitura

As classes System.IO.BinaryWriter e System.IO.BinaryReader são usadas para gravar e ler dados que não sejam cadeias de caracteres. O exemplo a seguir mostra como criar um fluxo de arquivo vazio, gravar dados nele e ler dados dele.

...

https://docs.microsoft.com/pt-br/dotnet/standard/io/how-to-read-and-write-to-a-newly-created-data-file

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

[]'s,

Fabio I.