:TITLE: Acesso a arquivos 101 
;#
;# RCSID: $Header: /home/cvs/TclTutor3/lesson/Tcl_Portuguese/Tcl_Portuguese24.lsn,v 1.1 2008/08/02 12:37:36 clif Exp $
;# Copyright (c) 1995 Clif Flynt
;# 9300 Fleming Rd.
;# Dexter, MI  48130
;# clif@cflynt.com
;# Veja o arquivo "AVISO" com os termos da licença.
;#
;#*********************************************************
;# Portuguese translation: Lucio Agostinho Rocha
;# E-mail: outrosdiasvirao@yahoo.com.br
;# Last update: 10/01/2006
;#*********************************************************
::CMD:: if {([info exists tcl_platform])} {
  switch $tcl_platform(platform) {
    unix        {
                set Tutor(lsn.codeMod) {
                }
        }
    windows     {
                set Tutor(lsn.codeMod) {
                    {if {[glob -nocomplain C:/temp] != ""} {
                      regsub "/tmp" $line "C:/temp" line
		    }
		    }
                    {if {[glob -nocomplain C:/windows/temp] != ""} {
                      regsub "/tmp" $line "C:/windows/temp" line
		    }
		    }
                    {if {[glob -nocomplain C:/winnt/temp] != ""} {
                      regsub "/tmp" $line "C:/winnt/temp" line
		    }
		    }
                }         
        }
    mac         {
                set Tutor(lsn.codeMod) {
		}
                }
    default     {
                puts "I don't recognize the platform: $tcl_platform(platform)"
                puts "Can't set platform specific parameters"
                }
    } 
  }

:LESSON_TEXT_START_LEVEL 0:
Tcl suporta uma interface com o sistema de arquivos utilizando o mecanismo
de entrada/saída <I>bufferizado</I>.
<P>
Os métodos mais simples para acessar um arquivo são via gets e puts. Quando
há uma grande quantidade de dados para ser lido, todavia, é algumas vezes
mais eficiente utilzar o comando <CODE>read</CODE> para carregar todo o arquivo,
e então tratar o arquivo em suas linhas com o comando <CODE>split</CODE>.
<DL>
<B><DT>open</B> <I>nomeArquivo ?acesso? ?permissão?</I>
<DD>Abre um arquivo e retorna um token para ser usado quando acessar o
arquivo via <CODE> gets, puts, close, </CODE>etc.
<UL>
<I><LI>nomeArquivo</I> é o nome do arquivo para abrir.
<I><LI>acesso</I> é o modo de acesso ao arquivo.
<UL>
<B><LI>r</B>......Abre o arquivo para leitura. O arquivo deve existir previamente.
<B><LI>r+</B>...Abre o arquivo para leitura e escrita. O arquivo deve existir previamente.
<B><LI>w</B>.....Abre o arquivo para escrita. Cria o arquivo se ele não existir, ou 
atribui o seu tamanho para zero se ele já existe.
<B><LI>w+</B>..Abre o arquivo para leitura e escrita. Cria o arquivo se ele não existir, ou 
atribui o seu tamanho para zero se ele já existe.
<B><LI>a</B>......Abre o arquivo para escrita. O arquivo deve existir previamente.
Atribui a localização atual de escrita para o final do arquivo.
<B><LI>a+</B>...Abre o arquivo para escrita. Se o arquivo não existir, um novo
será criado. Atribui a localização atual de escrita para o final do arquivo.
</UL>
</UL>
<I><LI>permissão</I> é um inteiro usado para atribuir as permissões de acesso
ao arquivo. O padrão é rw-rw-rw- (0666).
</UL>
<B><DT>close</B> <I>arquivoID</I>
<DD>Fecha um arquivo aberto previamente com o comando <CODE>open</CODE>, 
e limpa qualquer saída restante.
<B><DT>gets</B> <I>arquivoID ?nomeVar?</I>
<DD>Lê uma linha da entrada de <I>arquivoID</I>, e descarta o caracter
de nova linha de finalização.
<P>
Se há um argumento <I>nomeVar</I>, <CODE>gets</CODE> retorna o número de
caracteres lidos (ou -1 se um EOF (End Of File - Fim de Arquivo) ocorre),
e coloca a linha da entrada em <I>nomeVar</I>.
<P>
Se <I>nomeVar</I> não for especificado, <CODE>gets</CODE> retorna a linha
da entrada. Uma string vazia será retornada se:
<UL>
<LI> Há uma linha em branco no arquivo.
<LI> A localização atual está no fim do arquivo. (Um EOF ocorre.)
</UL>
<B><DT>puts ?-nonewline?</B> <I>?arquivoID? string</I>
<DD>Escreve os caracteres na string para o fluxo referenciado
pelo <I>arquivoID</I>.
<P>
<I>arquivoID</I> pode ser:
<UL>
<LI>	O valor retornado por uma chamada anterior a <CODE>open</CODE> com
acesso a escrita
<LI>	stdout
<LI>	stderr
</UL>
<B><DT>read ?-nonewline?</B> <I>arquivoID</I>
<DD>Lê todos os bytes restantes de <I>arquivoID</I>, e retorna aquela
string. Se <B>-nonewline</B> é indicado, então o último caracter será
descartado se há um caracter de nova linha. Qualquer condição de fim
de arquivo é limpa antes do comando <CODE>read</CODE> ser executado.
<B><DT>read</B> <I>arquivoID numBytes</I>
<DD>Lê <I>numBytes</I> de <I>arquivoID</I>, e retorna a entrada como uma
string Tcl. Qualquer condição de fim de arquivo é limpa antes do
comando <CODE>read</CODE> ser executado.
<B><DT>seek</B> <I>arquivoID deslocamento ?origem?</I>
<DD>Muda a posição atual dentro do arquivo referenciado pelo <I>arquivoID</I>.
Note que se o arquivo for aberto com uma condição de <I>acesso</I> "a" a
posição atual não pode ser mudada antes do final do arquivo na escrita,
mas pode ser alterada para o início do arquivo na leitura.
<UL>
<I><LI>arquivoID</I> pode ser:
<UL>
<LI> um identificador de arquivo retornado pelo comando <CODE>open</CODE>
<LI> stdin
<LI> stdout
<LI> stderr
</UL>
<I><LI> deslocamento</I> é o deslocamento em bytes no qual a posição 
atual é atribuída. A posição de onde o deslocamento é medido, por padrão,
é o início do arquivo, mas pode ser da localização atual, ou o final do
arquivo, através da atribuição apropriada da <I>origem</I>.
<I><LI>origem</I> é a posição para medir de onde o <I>deslocamento</I> 
começa. O padrão é o início do arquivo. <I>origem</I> deve ser um dos
seguintes:
<UL>
<LI><B>start</B>.........o <I>deslocamento</I> é medido do início do arquivo.
<LI><B>current</B>...o <I>deslocamento</I> é medido da posição atual do arquivo.
<LI><B>end</B>...........<I>deslocamento</I> é medido do fim do arquivo.
</UL>
<B><DT>tell</B> <I>arquivoID </I>
<DD>Retorna a posição do ponteiro de acesso em <I>arquivoID</I> como
uma string decimal.
<B><DT>flush</B> <I>arquivoID</I>
<DD>Limpa qualquer saída que foi <I>bufferizada</I> por <I>arquivoID</I>.
<B><DT>eof</B> <I>arquivoID</I>
<DD>Retorna 1 se uma condição de fim de arquivo existe, caso contrário retorna 0.
</DL>
:TEXT_END:

:LESSON_TEXT_START_LEVEL 1:
Tcl suporta uma interface com o sistema de arquivos utilizando o mecanismo
de entrada/saída <I>bufferizado</I>.
<P>
Os métodos mais simples para acessar um arquivo são via <CODE>gets</CODE> e 
<CODE>puts</CODE>. Quando
há uma grande quantidade de dados para ser lido, todavia, é algumas vezes
mais eficiente utilzar o comando <CODE>read</CODE> para carregar todo o arquivo,
e então tratar o arquivo em suas linhas com o comando <CODE>split</CODE>.
<DL>
<B><DT>open</B> <I>nomeArquivo ?acesso? ?permissão?</I>
<DD>Abre um arquivo e retorna um token para ser usado quando acessar o
arquivo via <CODE> gets, puts, close, </CODE>etc.
<UL>
<I><LI>nomeArquivo</I> é o nome do arquivo para abrir.
<I><LI>acesso</I> é o modo de acesso ao arquivo.
<UL>
<B><LI>r</B>......Abre o arquivo para leitura. O arquivo deve existir previamente.
<B><LI>r+</B>...Abre o arquivo para leitura e escrita. O arquivo deve existir previamente.
<B><LI>w</B>.....Abre o arquivo para escrita. Cria o arquivo se ele não existir, ou 
atribui o seu tamanho para zero se ele já existe.
<B><LI>w+</B>..Abre o arquivo para leitura e escrita. Cria o arquivo se ele não existir, ou 
atribui o seu tamanho para zero se ele já existe.
<B><LI>a</B>......Abre o arquivo para escrita. O arquivo deve existir previamente.
Atribui a localização atual de escrita para o final do arquivo.
<B><LI>a+</B>...Abre o arquivo para escrita. Se o arquivo não existir, um novo
será criado. Atribui a localização atual de escrita para o final do arquivo.
</UL>
</UL>
<I><LI>permissão</I> é um inteiro usado para atribuir as permissões de acesso
ao arquivo. O padrão é rw-rw-rw- (0666).
</UL>
<B><DT>close</B> <I>arquivoID</I>
<DD>Fecha um arquivo aberto previamente com o comando <CODE>open</CODE>, 
e limpa qualquer saída restante.
<B><DT>gets</B> <I>arquivoID ?nomeVar?</I>
<DD>Lê uma linha da entrada de <I>arquivoID</I>, e descarta o caracter
de nova linha de finalização.
<P>
Se há um argumento <I>nomeVar</I>, <CODE>gets</CODE> retorna o número de
caracteres lidos (ou -1 se um EOF (End Of File - Fim de Arquivo) ocorre),
e coloca a linha da entrada em <I>nomeVar</I>.
<P>
Se <I>nomeVar</I> não for especificado, <CODE>gets</CODE> retorna a linha
da entrada. Uma string vazia será retornada se:
<UL>
<LI> Há uma linha em branco no arquivo.
<LI> A localização atual está no fim do arquivo. (Um EOF ocorre.)
</UL>
<B><DT>puts ?-nonewline?</B> <I>?arquivoID? string</I>
<DD>Escreve os caracteres na string para o fluxo referenciado
pelo <I>arquivoID</I>.
<P>
<I>arquivoID</I> pode ser:
<UL>
<LI>	O valor retornado por uma chamada anterior a <CODE>open</CODE> com
acesso a escrita
<LI>	stdout
<LI>	stderr
</UL>
<B><DT>read ?-nonewline?</B> <I>arquivoID</I>
<DD>Lê todos os bytes restantes de <I>arquivoID</I>, e retorna aquela
string. Se <B>-nonewline</B> é indicado, então o último caracter será
descartado se há um caracter de nova linha. Qualquer condição de fim
de arquivo é limpa antes do comando <CODE>read</CODE> ser executado.
<B><DT>read</B> <I>arquivoID numBytes</I>
<DD>Lê <I>numBytes</I> de <I>arquivoID</I>, e retorna a entrada como uma
string Tcl. Qualquer condição de fim de arquivo é limpa antes do
comando <CODE>read</CODE> ser executado.
<B><DT>seek</B> <I>arquivoID deslocamento ?origem?</I>
<DD>Muda a posição atual dentro do arquivo referenciado pelo <I>arquivoID</I>.
Note que se o arquivo for aberto com uma condição de <I>acesso</I> "a" a
posição atual não pode ser mudada antes do final do arquivo na escrita,
mas pode ser alterada para o início do arquivo na leitura.
<UL>
<I><LI>arquivoID</I> pode ser:
<UL>
<LI> um identificador de arquivo retornado pelo comando <CODE>open</CODE>
<LI> stdin
<LI> stdout
<LI> stderr
</UL>
<I><LI> deslocamento</I> é o deslocamento em bytes no qual a posição 
atual é atribuída. A posição de onde o deslocamento é medido, por padrão,
é o início do arquivo, mas pode ser da localização atual, ou o final do
arquivo, através da atribuição apropriada da <I>origem</I>.
<I><LI>origem</I> é a posição para medir de onde o <I>deslocamento</I> 
começa. O padrão é o início do arquivo. <I>origem</I> deve ser um dos
seguintes:
<UL>
<LI><B>start</B>.........o <I>deslocamento</I> é medido do início do arquivo.
<LI><B>current</B>...o <I>deslocamento</I> é medido da posição atual do arquivo.
<LI><B>end</B>...........<I>deslocamento</I> é medido do fim do arquivo.
</UL>
<B><DT>tell</B> <I>arquivoID </I>
<DD>Retorna a posição do ponteiro de acesso em <I>arquivoID</I> como
uma string decimal.
<B><DT>flush</B> <I>arquivoID</I>
<DD>Limpa qualquer saída que foi <I>bufferizada</I> por <I>arquivoID</I>.
<B><DT>eof</B> <I>arquivoID</I>
<DD>Retorna 1 se uma condição de fim de arquivo existe, caso contrário retorna 0.
</DL>
<P>
Pontos a serem lembrados sobre o acesso Tcl a arquivos:
<UL>
<LI>A entrada/saída de arquivos é <I>bufferizada</I>. A saída pode
não enviar os dados quando você espera que eles sejam enviados.
Todos os arquivos serão fechados e liberados da memória quando
seu programa terminar normalmente, mas podem ser apenas fechados
(não limpos da memória) se o programa terminar de maneira inesperada.

<LI>Há um número finito de espaços disponíveis para abrir arquivos.
Se você espera que o programa execute de uma forma que irá causar
a abertura de muitos arquivos, lembre-se de fechar os arquivos quando
você terminar de utilizá-los.

<LI>Uma linha vazia não é distingüível de um EOF com o comando:
<P><CODE>set string [gets nomeArquivo]</CODE>. <P>
Use o comando <CODE>eof</CODE> 
para determinar se o arquivo está no fim.

<LI>Você não pode sobrescrever qualquer dado em um arquivo que foi aberto
com o <I>acesso</I> <B>a</B>. Você pode, todavia, orientar-se do início do
arquivo e utilizar comandos <CODE>gets</CODE>.

<LI>A abertura de um arquivo com o acesso <B>w+</B> irá permitir que você 
sobrescreva dados, mas irá apagar qualquer dado existente no arquivo.

<LI>A abertura de um arquivo com o acesso <B>r+</B> irá permitir que você
sobrescreva dados, enquanto salva os dados pré-existentes no arquivo.

<LI>Todos os dados em Tcl são salvos como strings ASCII. Isso significa
que ler um arquivo binário pode produzir resultados inesperados.
</UL>

:TEXT_END:

:LESSON_TEXT_START_LEVEL 2:
Tcl suporta uma interface com o sistema de arquivos utilizando o
mecanismo <I>bufferizado</I> de entrada/saída. Esse mecanismo
trata o arquivo como um fluxo de caracteres que começam no
início do arquivo, e executam um após o outro até o final. Isso
faz um arquivo se parecer com um terminal para o programa, e um
programa pode escrever uma linha da entrada para um arquivo com o
mesmo comando <CODE>puts</CODE> (mas com um novo argumento)
que é usado para exibir o texto na tela. Dados podem ser lidos
de um arquivo com um comando <CODE>gets</CODE>, da mesma forma
como eles poderiam ser lidos de um teclado.
<P>
Antes que um arquivo possa ser acessado desta maneira o programa 
tem que declarar qual arquivo será acessado, e se ele será acessado
para leitura, escrita, ou ambos. Esta declaração é feita com o
comando <CODE>open</CODE>. Uma vez que o arquivo esteja aberto,
o programa pode executar chamadas <CODE>gets</CODE> e <CODE>puts</CODE> 
para ler ou escrever linhas de dados no arquivo.
<P>
Um programa pode também usar um comando <CODE>seek</CODE> para
posicionar um marcador dentro do arquivo. Depois que o marcador
for colocado, o próximo <CODE>gets</CODE> ou <CODE>puts</CODE> 
irá ocorrer a partir daquela localização.
<P>
Quando um programa termina de utilizar um arquivo, ele deve fechar
esse arquivo. Há um número finito de espaços de descritores de
arquivos abertos disponíveis para um programa, e se você negligenciar o
fechamento de arquivos, você pode encontrar falhas no seu programa quando
ele executar fora dos espaços dos descritores.
<P>
Os comandos para acessar um arquivo são:
<DL>
<B><DT>open</B> <I>nomeArquivo ?acesso? ?permissão?</I>
<DD>Abre um arquivo e retorna um token para ser usado quando acessar o
arquivo via <CODE> gets, puts, close, </CODE>etc.
<UL>
<I><LI>nomeArquivo</I> é o nome do arquivo para abrir.
<I><LI>acesso</I> é o modo de acesso ao arquivo.
<UL>
<B><LI>r</B>......Abre o arquivo para leitura. O arquivo deve existir previamente.
<B><LI>r+</B>...Abre o arquivo para leitura e escrita. O arquivo deve existir previamente.
<B><LI>w</B>.....Abre o arquivo para escrita. Cria o arquivo se ele não existir, ou 
atribui o seu tamanho para zero se ele já existe.
<B><LI>w+</B>..Abre o arquivo para leitura e escrita. Cria o arquivo se ele não existir, ou 
atribui o seu tamanho para zero se ele já existe.
<B><LI>a</B>......Abre o arquivo para escrita. O arquivo deve existir previamente.
Atribui a localização atual de escrita para o final do arquivo.
<B><LI>a+</B>...Abre o arquivo para escrita. Se o arquivo não existir, um novo
será criado. Atribui a localização atual de escrita para o final do arquivo.
</UL>
</UL>
<I><LI>permissão</I> é um inteiro usado para indicar as permissões de acesso
ao arquivo. O padrão é rw-rw-rw- (0666).  
<P>O sistema de arquivos unix permite que você indique a quantidade de
acesso que as pessoas estão permitidas a ter em seus arquivos. As
permissões são atribuídas em três grupos com três tipos de modos de acesso.
<P>
Os três modos de acesso (permissões) que você pode atribuir para os
seus arquivos são:
<UL>
<LI> Read........(Leitura) Permite que o arquivo seja lido
<LI> Write.......(Escrita) Permite que o arquivo seja escrito
<LI> Execute..(Execução) Permite que o arquivo seja executado
</UL>
<P>
Os três grupos são:
<UL>
<LI>User...... (Usuário) Você
<LI>Group... (Grupo) As outras pessoas no seu grupo
<LI>Others.... (Outros) Quaisquer outros usuários
</UL>
<P>
A permissão do arquivo é atribuída com três dígitos octais, cada
dígito octal tem um grupo, e cada bit dentro do dígito é um direito
de acesso.
<PRE>
Outros-----------------|
                       |
Grupo -------------|   |
                   |   |
Usuário  ------|   |   |
               ___ ___ ___
               000 000 000
               R   R   R   ------ Read    (Leitura)
                W   W   W  ------ Write   (Escrita)
                 X   X   X ------ Execute (Execução)
               
</PRE>
Para restringir que outros usuários fora do seu grupo leiam seus arquivos,
mas permitir que seu grupo tenha acesso de leitura, enquanto apenas você
tenha acesso de escrita em seus arquivos, você deveria usar a máscara
<CODE>0046</CODE>. O primeiro 0 marca a string como uma string octal.
O próximo 0 indica as permissões de acesso para os usuários fora
do seu grupo para não leitura, não escrita e não execução. O 4
indica o bit de leitura para membros do seu grupo. O 6 final indica
acesso de leitura e escrita para o dono do arquivo (você).
<P>
Para tornar um arquivo executável, você marca o bit de mais baixa ordem.
Por exemplo, quando você escreve um programa Tcl e o salva em um arquivo,
você irá marcar as permissões de leitura e execução (provavelmente com
um comando unix <CODE>chmod</CODE>) de forma a apenas digitar o nome
do arquivo e executar o script.
</UL>

<B><DT>close</B> <I>arquivoID</I>
<DD>Fecha um arquivo aberto previamente com o comando <CODE>open</CODE>, 
e limpa qualquer saída restante.
<B><DT>gets</B> <I>arquivoID ?nomeVar?</I>
<DD>Lê uma linha da entrada de <I>arquivoID</I>, e descarta o caracter
de nova linha de finalização.
<P>
Se há um argumento <I>nomeVar</I>, <CODE>gets</CODE> retorna o número de
caracteres lidos (ou -1 se um EOF (End Of File - Fim de Arquivo) ocorre),
e coloca a linha da entrada em <I>nomeVar</I>.
<P>
Se <I>nomeVar</I> não for especificado, <CODE>gets</CODE> retorna a linha
da entrada. Uma string vazia será retornada se:
<UL>
<LI> Há uma linha em branco no arquivo.
<LI> A localização atual está no fim do arquivo. (Um EOF ocorre.)
</UL>
<B><DT>puts ?-nonewline?</B> <I>?arquivoID? string</I>
<DD>Escreve os caracteres na string para o fluxo referenciado
pelo <I>arquivoID</I>.
<P>
<I>arquivoID</I> pode ser:
<UL>
<LI>	O valor retornado por uma chamada anterior a <CODE>open</CODE> com
acesso a escrita
<LI>	stdout
<LI>	stderr
</UL>
<B><DT>read ?-nonewline?</B> <I>arquivoID</I>
<DD>Lê todos os bytes restantes de <I>arquivoID</I>, e retorna aquela
string. Se <B>-nonewline</B> é indicado, então o último caracter será
descartado se há um caracter de nova linha. Qualquer condição de fim
de arquivo é limpa antes do comando <CODE>read</CODE> ser executado.
<B><DT>read</B> <I>arquivoID numBytes</I>
<DD>Lê <I>numBytes</I> de <I>arquivoID</I>, e retorna a entrada como uma
string Tcl. Qualquer condição de fim de arquivo é limpa antes do
comando <CODE>read</CODE> ser executado.
<B><DT>seek</B> <I>arquivoID deslocamento ?origem?</I>
<DD>Muda a posição atual dentro do arquivo referenciado pelo <I>arquivoID</I>.
Note que se o arquivo for aberto com uma condição de <I>acesso</I> "a" a
posição atual não pode ser mudada antes do final do arquivo, na escrita,
mas pode ser alterada para o início do arquivo, na leitura.
<UL>
<I><LI>arquivoID</I> pode ser:
<UL>
<LI> um identificador de arquivo retornado pelo comando <CODE>open</CODE>
<LI> stdin
<LI> stdout
<LI> stderr
</UL>
<I><LI> deslocamento</I> é o deslocamento em bytes no qual a posição 
atual é atribuída. A posição de onde o deslocamento é medido, por padrão,
é o início do arquivo, mas pode ser da localização atual, ou o final do
arquivo, através da atribuição apropriada da <I>origem</I>.
<I><LI>origem</I> é a posição para medir de onde o <I>deslocamento</I> 
começa. O padrão é o início do arquivo. <I>origem</I> deve ser um dos
seguintes:
<UL>
<LI><B>start</B>.........o <I>deslocamento</I> é medido do início do arquivo.
<LI><B>current</B>...o <I>deslocamento</I> é medido da posição atual do arquivo.
<LI><B>end</B>...........<I>deslocamento</I> é medido do fim do arquivo.
</UL>
<B><DT>tell</B> <I>arquivoID </I>
<DD>Retorna a posição do ponteiro de acesso em <I>arquivoID</I> como
uma string decimal.
<B><DT>flush</B> <I>arquivoID</I>
<DD>Limpa qualquer saída que foi <I>bufferizada</I> por <I>arquivoID</I>.
<B><DT>eof</B> <I>arquivoID</I>
<DD>Retorna 1 se uma condição de fim de arquivo existe, caso contrário retorna 0.
</DL>
<P>
Pontos a serem lembrados sobre o acesso Tcl a arquivos:
<UL>
<LI>A entrada/saída de arquivos é <I>bufferizada</I>. Isso significa
que o sistema operacional mantém uma localização na memória para a
qual ele copia dados quando seu programa escreve esses dados. Mais tarde, quando
o computador não estiver ocupado, ou quando uma certa quantidade de
dados for acumulada no <I>buffer</I>, eles serão escritos. Portanto,
A saída pode não enviar os dados quando você espera que eles sejam enviados.
<P>
Você pode forçar o envio de dados do <I>buffer</I> para o disco com o
comando <CODE>flush</CODE>. Todos os arquivos serão fechados e liberados 
da memória quando seu programa terminar normalmente, mas podem ser apenas 
fechados (não limpos da memória) se o programa terminar de maneira inesperada.

<LI>
A entrada/saída de arquivos é <I>bufferizada</I>. 

<LI>Há um número finito de espaços disponíveis para abrir arquivos.
Se você espera que o programa execute de uma forma que irá causar
a abertura de muitos arquivos, lembre-se de fechar os arquivos quando
você terminar de utilizá-los.

<LI>Uma linha vazia não é distingüível de um EOF com o comando:
<P><CODE>set string [gets nomeArquivo]</CODE>. <P>
Use o comando <CODE>eof</CODE> 
para determinar se o arquivo está no fim.

<LI>Você não pode sobrescrever qualquer dado em um arquivo que foi aberto
com o <I>acesso</I> <B>a</B>. Você pode, todavia, orientar-se do início do
arquivo e utilizar comandos <CODE>gets</CODE>.

<LI>A abertura de um arquivo com o acesso <B>w+</B> irá permitir que você 
sobrescreva dados, mas irá apagar qualquer dado existente no arquivo.

<LI>A abertura de um arquivo com o acesso <B>r+</B> irá permitir que você
sobrescreva dados, enquanto salva os dados pré-existentes no arquivo.

<LI>Todos os dados em Tcl são salvos como strings ASCII. Isso significa
que ler um arquivo binário pode produzir resultados inesperados.
</UL>
:TEXT_END:

:CODE_START:

set arquivoID [open "/tmp/testfile" w+]

seek $arquivoID 0 start

puts $arquivoID "Isso é um teste.\nIsso é só um teste."

seek $arquivoID 0 start

set caracteres [gets $arquivoID linha1];
set linha2 [gets $arquivoID];

puts "Há $caracteres caracteres na string \"$linha1\""
puts "A segunda linha no arquivo é: \"$linha2\""

seek $arquivoID 0 start

set buffer [read $arquivoID];
puts "\nO conteúdo total do arquivo é:\n$buffer"
close $arquivoID
:TEXT_END: