-
Notifications
You must be signed in to change notification settings - Fork 11
/
Copy pathler-escrever-arquivos.html
135 lines (122 loc) · 11.6 KB
/
ler-escrever-arquivos.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en-us">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>Lendo e escrevendo em arquivos</title>
<meta name="author" content="" />
<!--- Blueprint CSS Framework -->
<link rel="stylesheet" href="css/blueprint/screen.css" type="text/css" media="screen, projection">
<link rel="stylesheet" href="css/blueprint/print.css" type="text/css" media="print">
<!--[if IE]>
<link rel="stylesheet" href="css/blueprint/ie.css" type="text/css" media="screen, projection">
<![endif]-->
<!-- CodeRay syntax highlighting CSS -->
<link rel="stylesheet" href="css/coderay.css" type="text/css" />
<!-- Homepage CSS -->
<link rel="stylesheet" href="css/site.css" type="text/css" media="screen, projection" />
</head>
<body>
<div class="container">
<div class="column span-22 prepend-1 append-1 first last" id="header">
<h1 class="title"><a href="index.html" alt="voltar para o início">Tutorial de Ruby do GURU-SP</a></h1>
<hr>
</div>
<div class="column span-17 prepend-1 first">
<p class="title">Lendo e escrevendo em arquivos</p>
<p>Vamos ver como podemos ler/escrever para um arquivo de texto com a ajuda de um simples programa <b>p027readwrite.rb</b></p>
<div class="CodeRay">
<pre><span class="no"> 1</span> <span class="c"># p027readwrite.rb</span>
<span class="no"> 2</span> <span class="c"># Abrir e ler um arquivo de texto</span>
<span class="no"> 3</span> <span class="c"># Note que como é dado um bloco, o arquivo</span>
<span class="no"> 4</span> <span class="c"># é automaticamente fechado quando o bloco termina</span>
<span class="no"> 5</span> <span class="co">File</span>.open(<span class="s"><span class="dl">'</span><span class="k">p014constructs.rb</span><span class="dl">'</span></span>, <span class="s"><span class="dl">'</span><span class="k">r</span><span class="dl">'</span></span>) <span class="r">do</span> |f1|
<span class="no"> 6</span> <span class="r">while</span> line = f1.gets
<span class="no"> 7</span> puts line
<span class="no"> 8</span> <span class="r">end</span>
<span class="no"> 9</span> <span class="r">end</span>
<span class="no"><strong>10</strong></span>
<span class="no">11</span> <span class="c"># Cria um novo arquivo e escreve nele</span>
<span class="no">12</span> <span class="co">File</span>.open(<span class="s"><span class="dl">'</span><span class="k">test.rb</span><span class="dl">'</span></span>, <span class="s"><span class="dl">'</span><span class="k">w</span><span class="dl">'</span></span>) <span class="r">do</span> |f2|
<span class="no">13</span> <span class="c"># use "\n" para duas linhas de texto</span>
<span class="no">14</span> f2.puts <span class="s"><span class="dl">"</span><span class="k">Criado por Satish</span><span class="ch">\n</span><span class="k">Gracas a Deus!</span><span class="dl">"</span></span>
<span class="no">15</span> <span class="r">end</span>
</pre>
</div>
<p>O método <b>File.open</b> pode abrir o arquivo em modos diferentes como o ‘r’ (somente-leitura), que inicia no começo do arquivo; ‘r+’ Leitura/Escrita, começa no início do arquivo; ‘w’ Somente-escrita, trunca o arquivo existente para tamanho zero ou cria um novo arquivo para escrita. Cheque a documentação do Ruby para uma lista completa dos modos disponíveis. <b>File.open</b> abre um novo arquivo (<b>File</b>) se não existe nenhum bloco associado. Se o bloco opcional é dado, o arquivo será passado como argumento, e o arquivo será fechado automaticamente quando o bloco termina. Sempre feche um arquivo que você abriu. No caso de um arquivo aberto para escrita, isso é muito importante e pode até mesmo prevenir a perda de dados.</p>
<p><b>File</b> implementa um método <b>readlines</b> (lê linhas) que lê um arquivo inteiro dentro de um array, linha por linha.</p>
<div class="box">
<p>Ambos métodos de classe, <b>open</b> e <b>readlines</b>, pertencem a classe <b>IO</b>, cuja subclasse é <strong>File</strong>. Ainda não estudamos classes, objetos e herança mas, apenas para registro, estes dois métodos são herdados pela subclasse <b>File</b> da classe <b>IO</b>.</p>
</div>
<h2>Varrendo Árvores de Diretórios</h2>
<p>O módulo <b>Find</b> pode percorrer de maneira top-down (de cima para baixo) um conjunto de caminhos de arquivo, dados como argumento para o método <b>find</b>. Se o argumento for um diretório, então seu nome e o nome de todos seus arquivos e subdiretórios serão passados (no exemplo abaixo, isso seria a partir do diretório que você roda o programa).</p>
<div class="CodeRay">
<pre><span class="no"> 1</span> require <span class="s"><span class="dl">'</span><span class="k">find</span><span class="dl">'</span></span>
<span class="no"> 2</span> <span class="co">Find</span>.find(<span class="s"><span class="dl">'</span><span class="k">./</span><span class="dl">'</span></span>) <span class="r">do</span> |f|
<span class="no"> 3</span> type = <span class="r">case</span>
<span class="no"> 4</span> <span class="r">when</span> <span class="co">File</span>.file?(f) <span class="r">then</span> <span class="s"><span class="dl">"</span><span class="k">F</span><span class="dl">"</span></span>
<span class="no"> 5</span> <span class="r">when</span> <span class="co">File</span>.directory?(f) <span class="r">then</span> <span class="s"><span class="dl">"</span><span class="k">D</span><span class="dl">"</span></span>
<span class="no"> 6</span> <span class="r">else</span> <span class="s"><span class="dl">"</span><span class="k">?</span><span class="dl">"</span></span>
<span class="no"> 7</span> <span class="r">end</span>
<span class="no"> 8</span> puts <span class="s"><span class="dl">"</span><span class="il"><span class="idl">#{</span>type<span class="idl">}</span></span><span class="k">: </span><span class="il"><span class="idl">#{</span>f<span class="idl">}</span></span><span class="dl">"</span></span>
<span class="no"> 9</span> <span class="r">end</span>
</pre>
</div>
<p>Falaremos sobre <b>require</b> em breve.</p>
<h2>Acesso Aleatório</h2>
<p>É bastante fácil acessar um arquivo aleatoriamente. Digamos que temos um arquivo texto (chamado hellousa.rb) cujo conteúdo é mostrado abaixo:</p>
<div class="CodeRay">
<pre><span class="no">1</span> puts <span class="s"><span class="dl">'</span><span class="k">Ola EUA</span><span class="dl">'</span></span>
</pre>
</div>
<p>Agora precisamos mostrar o conteúdo do arquivo a partir da palavra EUA. Aqui está como – programa <b>p028xrandom.rb</b>:</p>
<div class="CodeRay">
<pre><span class="no"> 1</span> <span class="c"># p028xrandom.rb</span>
<span class="no"> 2</span> <span class="c"># Precisamos mostrar o conteúdo do arquivo a partir da palavra EUA</span>
<span class="no"> 3</span> f = <span class="co">File</span>.new(<span class="s"><span class="dl">"</span><span class="k">hellousa.rb</span><span class="dl">"</span></span>)
<span class="no"> 4</span>
<span class="no"> 5</span> <span class="c"># SEEK_CUR - Busca a partir do primeiro parâmetro inteiro mais a posição atual</span>
<span class="no"> 6</span> <span class="c"># SEEK_END - Busca a partir do primeiro parâmetro inteiro mais a posição final do stream</span>
<span class="no"> 7</span> <span class="c"># (você provavelmente quer um valor negativo para o primeiro parâmetro inteiro)</span>
<span class="no"> 8</span> <span class="c"># SEEK_SET - Busca a partir da posição absoluta dada pelo primeiro parâmetro inteiro</span>
<span class="no"> 9</span> <span class="c"># :: é o operador de escopo - será explicado mais tarde</span>
<span class="no"><strong>10</strong></span> f.seek(<span class="i">10</span>, <span class="co">IO</span>::<span class="co">SEEK_SET</span>)
<span class="no">11</span> print f.readline
<span class="no">12</span> f.close
</pre>
</div>
<p>A saída é:</p>
<div class="CodeRay">
<pre><span class="no">1</span> >ruby p028xrandom.rb
<span class="no">2</span> EUA'
<span class="no">3</span> >Exit code: 0
</pre>
</div>
<p>O Ruby suporta a ideia de um apontador para um arquivo. O apontador indica a posição atual no arquivo. O método <b>File.new</b> abri o arquivo ‘hellousa.rb’ no modo somente leitura (modo padrão), retorna um novo objeto <b>File</b> e o ponteiro para o arquivo é posicionado no início do mesmo. No programa acima, a próxima instrução é f.seek(10, IO:SEEK_SET). O método <b>seek</b> da classe <a href="http://www.ruby-doc.org/ruby-1.9/classes/IO.html"><b>IO</b></a>, move o ponteiro do arquivo para uma distância dada por um número inteiro (o primeiro parâmetro do método <strong>seek</strong>) no stream de acordo com o valor do segundo parâmetro no método <b>seek</b>.</p>
<p><b>IO::SEEK_CUR</b> – Busca a partir do primeiro parâmetro inteiro mais a posição atual;<br />
<b>IO::SEEK_END</b> – Busca a partir do primeiro parâmetro inteiro mais a posição final do stream (você provavelmente quer um valor negativo para o primeiro parâmetro inteiro);<br />
<b>IO::SEEK_SET</b> – Busca a partir da posição absoluta dada pelo primeiro parâmetro inteiro.</p>
<p>Leia mais sobre o operador :: na <a href="constantes.html">seção sobre constantes</a>.</p>
<h2>Ruby permite a serialização de um objeto?</h2>
<p>Uma das funcionalidades do Java é a capacidade de serializar objetos, o que permite que você armazene-os em qualquer lugar e então os reconstitua quando necessário. O Ruby chama esse tipo de serialização de marshaling (“preparação”). Salvar um objeto e alguns ou todos os seus componentes é feito usando o método <b>Marshal.dump</b>. Em um momento posterior você pode reconstituir o objeto usando Marshal.load. O Ruby usa marshaling para armazenar dados de sessão. Dirija-se ao <a href="serializacao-ruby.html">tópico Serialização de Objetos</a> para saber mais.</p>
<h2>Sumário</h2>
<p>Listei todos os <a href="sumario-ruby4.html">pontos importantes</a> que você precisa saber após ter completado os seguintes tópicos: Arrays, Intervalos, Símbolos, Hashes (Dicionários), Números aleatórios, Lendo/Escrevendo em arquivos de texto.</p>
<div class="pagination"><a href="sumario-ruby4.html">Resumo 4 ></a></div>
</div>
<div class="column span-5 append-1 last">
<p><a href="http://www.gurusp.org" title="Grupo de Usuários Ruby de SP"><img src="images/logo_guru-sp.jpg" title="Logo do GURU-SP" alt="Logo do Guru-SP" /></a></p>
<div class="box">
<p>Este material tem como base o <a href="http://www.rubylearning.com" title="Ruby Learning">tutorial do RubyLearning.com de Satish Talim</a> e foi traduzido por membros do <a href="http://www.gurusp.org" title="Grupo de Usuários Ruby de SP">GURU-SP</a> com a permissão do autor.</p>
<p class="last">Ajude o RubyLearning participando em algum dos <a href="http://www.rubylearning.org" title="cursos do Ruby Learning">cursos pagos</a> ou <a href="http://pledgie.com/campaigns/415" title="Ajude o Ruby Learning">fazendo uma doação para o projeto</a></p>
</div>
<p class="quiet"><a href="index.html" title="índice">Voltar para o índice</a></p>
<h5></h5>
<p class="incr"></p>
</div>
<div class="column span-22 prepend-1 append-1 first last" id="footer">
<hr />
<p>Tuturial de Ruby do <a href="http://www.gurusp.org" title="Grupo de Usuários Ruby de SP">GURU-SP</a>. Este site foi criado com <a href="http://webby.rubyforge.org">Webby</a></p>
</div>
</div>
</body>
</html>