Arquivos de Textos no C - Básico
Transcrição
Arquivos de Textos no C - Básico
OpenStax-CNX module: m47676 1 ∗ Arquivos de Textos no C - Básico Joao Carlos Ferreira dos Santos This work is produced by OpenStax-CNX and licensed under the † Creative Commons Attribution License 3.0 TRABALHANDO COM ARQUIVO DE TEXTO NO C# Introdução A linguagem C# foi criada pela Microsoft e faz parte do framework .NET. É uma linguagem orientada a objetos e sua estrutura é baseada na linguagem C++, mas também tem inuência de outras linguagens orientada a objetos. Além de ser uma linguagem de fácil aprendizagem podemos ainda contar com a praticidade dos recursos do ambiente de desenvolvimento do Visual Studio. Neste artigo, indicarei como trabalhar com arquivos de texto no C#. Mostrarei uma prévia do conhecimento necessário para trabalhar com esses arquivos, e criarei um programa do tipo Windows Form utilizando os recursos apresentados. Instalando as Ferramentas de Desenvolvimento. Para facilitar o aprendizado e ainda o desenvolvimento utilizando a linguagem C# vamos instalar a IDE Visual Studio 2010 Express. Essa ferramenta é gratuita e pode ser baixada no site da Microsoft. Para instalação do Visual Studio temos que seguir os passos listados, abaixo: • • • Primeiro: acessar o site http://www.microsoft.com/visualstudio/ptb 1 ir na guia Downloads depois; Visual Studio 2010 Express; depois em Visual C# 2010 Express escolher o idioma e clicar em Instalar agora. Segundo: escolher a versão em seguida na opção Terceiro: Agora após a instalação do programa podemos acessá-lo em botão do Windows Microsoft Visual Studio 2010 Express. ∗ Version 1.1: Sep 23, 2013 7:54 am -0500 † http://creativecommons.org/licenses/by/3.0/ 1 http://www.microsoft.com/visualstudio/ptb http://cnx.org/content/m47676/1.1/ Todos os Programas OpenStax-CNX module: m47676 2 Figure 1 Nota: esse caminho para acessar o Visual Studio serve para versão do Windows 7. Tipos de Dados Esse tópico serve para mostrar os tipos de dados existentes na linguagem C#. O Tipo de dado em uma linguagem de programação inuencia no tamanho que o dado ocupa na memória do computador. Qualquer linguagem de programação trabalha com diversos tipos de dados e os mais comuns entre todas elas são: inteiro, ponto-utuante, booleano e texto. O C# também trabalha com esses tipos, mas vou mostrar de forma mais especica os tipos de dados desta linguagem. O C# trabalha com duas categorias de tipos de dados: • • Valor Referencia Variáveis do tipo Valor ainda tem duas subdivisões conforme mostro abaixo: http://cnx.org/content/m47676/1.1/ OpenStax-CNX module: m47676 • • 3 Booleanos Numéricos Variável de Valor - Tipo Booleano true) Esse tipo representa valores lógicos, ou seja, verdadeiro ( false). ou falso ( Quando esse tipo de variável é declarado no C#, o seu valor padrão é false ( caso não seja denido um valor pelo programador). Variável de Valor - Tipo Numérico Os tipos numéricos são divididos em três categorias no C# sendo eles: • Inteiro • • • • • • • char 16 bits long 64 bits ulong 64 bits sbyte 8 bits int 32 bits short 16 bits ushort 16 bits • Ponto-utuante • • oat 32 bits double 64 bits • Decimal • Decimal 128 bits Obs.: a descrição bits representa o quanto de espaço aquele tipo de dado ocupa na memória do computador. Referência também tem duas subdivisões sendo elas: Variáveis do tipo • • Class String Referência - Class É um tipo de dado construído, ou seja, um modelo que pode conter campos, constantes e operações próprias. Referência string Em C# o tipo string herda diretamente da classe de objetos e serve também para armazenar dados do tipo texto. É preciso sempre analisar em qual situação deve-se usar determinado tipo de dado para não ter uso inadequado da memória do computador como, por exemplo, declarar uma variável do tipo com informações de idade. Nesse caso, o tipo int já estaria de bom grado. oat para trabalhar Supondo que cada quadradinho das imagens abaixo representa um endereço de memória e que cada um tivesse a capacidade de armazenar até 20 bits. Se declarasse o oat para trabalhar com informações sobre idade estaría desperdiçando memória, conforme pode-se ver nos dois quadrados Usando o oat: http://cnx.org/content/m47676/1.1/ OpenStax-CNX module: m47676 4 Figure 2 Usando o int: Figure 3 Trabalhando com Vetores Vetores são estruturas de dados onde podemos armazenar uma quantidade de um tipo especico de dados. O tipo especicado em um vetor será armazenado em posições diferentes dele. Para car mais claro vamos a um exemplo. Declarar um vetor que trabalhara com dados do tipo texto com no máximo cinco posições seria assim: string[] pessoa = new string(5); pessoa[0] = maria; pessoa[1] = antonio; pessoa[2] = joao; pessoa[3] = rodrigo; pessoa[4] = marinho; http://cnx.org/content/m47676/1.1/ OpenStax-CNX module: m47676 5 Figure 4 Os vetores sempre iniciam em zero, por tanto, se for declarado um vetor de cinco posições teremos na verdade um intervalo de zero a quatro, ou seja, o tamanho de um vetor declarado será sempre sua quantidade declarada menos um. Conversão de Tipos no C# No C# existem duas formas de conversão de dados que são feitas: de forma implícita e explicita. Forma Implícita A conversão implícita ocorre da seguinte forma: quando se declara uma variável de um tipo inteiro, por exemplo, essa variável pode ser atribuída à outra variável de um tipo ponto-utuante e a conversão ocorre de forma automática. Quando isso ocorre dizemos que ocorreu um cast implícito. No entanto, um tipo oat não pode ser atribuído em um tipo int, isso porque um tipo oat é capaz de armazenar um volume maior de informações que um tipo int. Portanto, não é possível essa conversão implicitamente. Outra impossibilidade é atribuir um tipo texto a um tipo numérico. Abaixo, temos os exemplos da explicação: A conversão implícita não ocorre: Figure 5 A conversão implícita ocorre: http://cnx.org/content/m47676/1.1/ OpenStax-CNX module: m47676 6 Figure 6 Forma Explicita Em alguns casos é necessário realizar a conversão dos tipos de dados de forma explicita. Um exemplo de conversão explicita pode ser usando um cast ou um comando de conversão. Vamos ver as duas formas: Usando Cast No caso do cast nós podemos converter operações simples como, por exemplo, um tipo oat para um tipo int, mas devemos tomar cuidado com esse tipo de conversão já que podemos ter perda signicativa de dados. Um exemplo seria ter um valor do tipo oat 34,5 e jogar para uma variável do tipo int. Provavelmente, quando o tipo oat passada para o tipo int nós teríamos como retorno o valor 34 apenas, ou seja, perderíamos a parte decimal do número. Fazemos um cast colocando antes do valor atribuído e entre parênteses o tipo de dados para o qual vamos usar. Exemplo de cast: Figure 7 Usando Comandos http://cnx.org/content/m47676/1.1/ OpenStax-CNX module: m47676 7 O C# disponibiliza comandos para conversão de tipos de dados através da classe Convert. Para usar esse recurso basta digitar o nome Convert seguido do operador ponto e o nome do método que deseja usar. No exemplo abaixo podemos ver a conversão de um tipo texto para o tipo numérico usando um método da classe Convert: Figure 8 Trabalhando com Classes Na programação uma classe nada mais é que um modelo onde nós denimos o comportamento de um objeto através de ações, estados e atributos. Pela denição da estrutura da classe podemos identicar o tipo de serviço que ela fornece. Com a criação da classe podemos dizer que criamos um novo tipo de dado. Vamos agora trabalhar com classes na linguagem C# mostrando sua construção e o uso de seus objetos. Imaginemos a criação de um sistema de biblioteca escolar onde teríamos o gerenciamento de reserva, entrega e pesquisa de livros. Certamente nesse sistema teríamos uma entidade responsável pela identicação dos livros, ou seja, uma classe que poderíamos dar o nome de Livro. Após identicarmos a necessidade de criação dessa classe teríamos que denir sua estrutura e basicamente o que podemos encontrar em um livro seria ISBN, Autor, Editora e Paginas. Esses itens seriam os atributos da nossa classe Livro as ações seriam métodos como reservar, consultar e devolver. As Classes StreamReader e StreamWriter Através dessas dessas classes podemos trabalhar com o processo de entrada/saída (input/output) de dados em arquivos sequenciais. StreamWriter Com os recursos disponíveis nessa classe podemos trabalhar com a escrita de caracteres em arquivos sequenciais. Por exemplo, para escrever a seguinte frase em um arquivo poderíamos criar o código, abaixo: http://cnx.org/content/m47676/1.1/ OpenStax-CNX module: m47676 8 Figure 9 O código acima cria um arquivo chamado dados.txt (caso o arquivo ainda não exista) e escreve nesse arquivo o texto Meus dados escritos no arquivo e por m fecha a conexão com o arquivo. Toda vez que esse código for executado o texto será sobre escrito, mas para evitar que isso aconteça pode-se incluir um segundo parâmetro no construtor da classe. Assim, o código manteria os dados já existes no arquivo e incluiria novos sempre após o ultimo registro. Figure 10 StreamReader Com os recursos disponíveis nessa classe podemos realizar a leitura em arquivos sequencias. Por exemplo, para ler o mesmo arquivo escrito no exemplo anterior poderíamos fazer o seguinte: http://cnx.org/content/m47676/1.1/ OpenStax-CNX module: m47676 9 Figure 11 Agora, vamos por em prática os conceitos vistos criando um mini-sistema para controle de empréstimo de livros em uma biblioteca universitária. Nosso sistema será bem simples. Teremos uma classe Aluno para controle dos alunos, uma classe Livro controle dos livros e uma classe Reservas para controle do livros emprestados. Os dados referentes a livros, alunos e reservas serão armazenados em arquivos do tipo txt. Precisamos criar três arquivos para utilizarmos como fonte de dados do sistema nomeados como Livros.txt, Alunos.txt e Reservados.txt em uma pasta chamada Temp na unidade C:. Arquivo Alunos.txt Figure 12 Arquivo Livros.txt http://cnx.org/content/m47676/1.1/ OpenStax-CNX module: m47676 10 Figure 13 Arquivo Reservados.txt Figure 14 Agora, criaremos um projeto do tipo Windows Form Application no Visual Studio. Studio, depois vá em Abra o Visual File New Project em seguida, nos Templates escolha a opção Windows Form Application e dê um nome para sua aplicação conforme a imagem abaixo: http://cnx.org/content/m47676/1.1/ OpenStax-CNX module: m47676 11 Figure 15 Feito isso, dê o OK e o Visual Studio ira gerar o projeto. Nesse projeto nós encontramos por padrão a classe Program.cs e um formulário nomeado como Form1, mas precisamos incluir novos objetos nesse projetos. Primeiro, vamos incluir mais um Windows Form e nomear para frmMenu e renomear o já existente para frmConsultar. Depois, inserir os outros objetos até que que igual a imagem abaixo: http://cnx.org/content/m47676/1.1/ OpenStax-CNX module: m47676 12 Figure 16 Incluir também os seguintes eventos para cada um dos objetos: Objeto frmConsular: private void frmConsultar_Load(object sender, EventArgs e) { lblStatus.Text = ""; btnLivroCom.Enabled = false; btnDevolver.Enabled = false; btnReservar.Enabled = false; } Objeto txtConsuta: private void txtConsulta_TextChanged(object sender, EventArgs e) { objLivro = new Livro(); string[] arrLivro = new string[objLivro.buscaLivros(txtConsulta.Text).Length]; http://cnx.org/content/m47676/1.1/ OpenStax-CNX module: m47676 13 lstLivros.Items.Clear(); lstLivros.Items.Add("Código Título Autor Editora "); foreach (string strItem in objLivro.buscaLivros(txtConsulta.Text)) { lstLivros.Items.Add(strItem.ToString().Trim()); } } Objeto lstLivros: private void lstLivos_SelectedIndexChanged(object sender, EventArgs e) { objReserva = new Reserva(); string strItem = objReserva.buscarReserva(lstLivros.SelectedItem.ToString().Substring(0, 2).Trim()); string meuRegistro = strItem; if (meuRegistro.Length > 0) { lblStatus.Text = "Reservado"; lblStatus.ForeColor = System.Drawing.Color.Red; btnLivroCom.Enabled = true; btnDevolver.Enabled = true; btnReservar.Enabled = false; // Variável com visão global dadosReserva = meuRegistro; } else { lblStatus.Text = "Disponível"; lblStatus.ForeColor = System.Drawing.Color.Blue; btnLivroCom.Enabled = false; btnDevolver.Enabled = false; btnReservar.Enabled = true; } } Objeto btnLivroCom: private void btnLivroCom_Click(object sender, EventArgs e) { Form f1 = new frmManu(dadosReserva); f1.Show(); } Objeto btnDevolver: private void btnDevolver_Click(object sender, EventArgs e) { string regLivro = lstLivros.SelectedItem.ToString(); objReserva.limpaReserva(regLivro.Substring(0,2).ToString().Trim()); MessageBox.Show("Livro entregue!"); } Objeto btnReservar: private void btnReservar_Click(object sender, EventArgs e) { string regLivro; objReserva = new Reserva(); regLivro = lstLivros.SelectedItem.ToString(); if (txtMatricula.Text.Length != 7) { http://cnx.org/content/m47676/1.1/ OpenStax-CNX module: m47676 14 MessageBox.Show("Falta Matricula / Matricula Invalida"); return; } objReserva.gravarReserva(regLivro.Substring(0, 2).Trim(), txtMatricula.Text.Trim()); MessageBox.Show("Reserva realizada!"); txtMatricula.Text = ""; } Agora para o segundo formulário: Figure 17 Evento do objeto frmMenu: private void frmMenu_Load(object sender, EventArgs e) { //MessageBox.Show(minhasReservas); lblDataReserva.Text = minhasReservas.Substring(17, 10); objAluno.buscaAluno(minhasReservas.Substring(7, 10).Trim()); lblMatricula.Text = objAluno.matricula.ToString() ; lblNome.Text = objAluno.nome; lblTelefone.Text = objAluno.telefone; lblEndereco.Text = objAluno.endereco; } Nota: nesse projeto temos uma mudança no construtor do formulário frmMenu sendo necessário deixá-lo assim: http://cnx.org/content/m47676/1.1/ OpenStax-CNX module: m47676 15 public frmMenu(string argReserva) { InitializeComponent(); minhasReservas = argReserva; } Agora, para nalizar, vamos incluir as classes que fazem parte do projeto. Para incluir as classes devemos clicar sobre BibliotecaApp Add New Item Class. Reserva) temos que incluir o código de cada uma. Código da Classe Livro class Livro { string[] arrRegistro; StreamReader sr; public string[] buscaLivros(string argLivro) { sr = new StreamReader(@"C:\Temp\Livros.txt"); arrRegistro = new string[20]; int i = 0; while (!sr.EndOfStream) { string registro = sr.ReadLine(); if (registro.Contains(argLivro)) { arrRegistro[i] = registro; i++; } } return arrRegistro; } } Código da Classe Aluno class Aluno { public string matricula; public string nome; public string telefone; public string endereco; StreamReader sr; public void buscaAluno(string argCodigo) { sr = new StreamReader(@"C:\Temp\Alunos.txt"); string regAluno; while (!sr.EndOfStream) { regAluno = sr.ReadLine().ToString(); if (regAluno.Contains(argCodigo)) { string[] arrAluno = regAluno.Split(';'); matricula = arrAluno[0]; nome = arrAluno[1]; telefone = arrAluno[2]; endereco = arrAluno[3]; } } } } Código da Classe Reserva http://cnx.org/content/m47676/1.1/ Após criar as três classes (Livro, Aluno e OpenStax-CNX module: m47676 16 class Reserva { StreamReader sr; StreamWriter sw; string registro = ""; public string buscarReserva(string argCodigo) { sr = new StreamReader(@"C:\Temp\Reservados.txt"); string linhaReg; while (!sr.EndOfStream) { linhaReg = sr.ReadLine().ToString(); if (argCodigo != linhaReg.Substring(0, 2)) { registro = ""; } else { registro = linhaReg; sr.Close(); return registro; } } sr.Close(); return registro; } public void gravarReserva(string argCodigo, string argMatricula) { sw = new StreamWriter(@"C:\Temp\Reservados.txt",true); sw.WriteLine(argCodigo + " " + argMatricula + " " + DateTime.Today.ToString().Substring(0, 10)); sw.Close(); } public void limpaReserva(string argCodigo) { string[] arrReserva = new string[0]; sr = new StreamReader(@"C:\Temp\Reservados.txt"); int i = 0; while (!sr.EndOfStream) { string strLinha = sr.ReadLine(); if (argCodigo != strLinha.Substring(0, 2).Trim()) { arrReserva[i] = strLinha; } } sr.Close(); sw = new StreamWriter(@"C:\Temp\Reservados.txt"); for (int j = 0; j < arrReserva.Length; j++){ sw.WriteLine(arrReserva[j]); } sw.Close(); } } O Código da Classe Program static class Program { /// <summary> http://cnx.org/content/m47676/1.1/ OpenStax-CNX module: m47676 17 /// The main entry point for the application. /// </summary> [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new frmConsultar()); } } note: Referências: Programação em C#: Acessado em 10/09/2013 http://cnx.org/content/m47676/1.1/ http://www.ev.org.br/Cursos/Paginas/Online.aspx.