Arquivos
| English | Português |
|---|---|
| file/faɪl/ | arquivo |
| text file/tekst faɪl/ | arquivo de texto |
| secondary storage/ˈsekəndəri ˈstɔːrɪdʒ/ | armazenamento secundário |
| persistence/pəˈsɪstəns/ | persistência |
| end of file/end ɒv faɪl/ | fim de arquivo |
| separator/ˈsepəreɪtə/ | separador |
| sequential/siːˈkwenʃl/ | sequencial |
O jogo que se lembrava
- Até 1987, desligar um console apagava tudo. Cada sessão começava na primeira tela; um jogo longo era uma tarde longa ou nada.
- The Legend of Zelda veio com uma pequena bateria dentro do cartucho que mantinha alguns bytes vivos. Pela primeira vez um jogo caseiro podia salvar e retomar onde você parou.
- Cada pontuação máxima, cada documento, cada configuração que você já guardou existe pela mesma razão: RAM esquece quando a energia vai, e um arquivo 文件 não.
- Esta lição é por que arquivos existem e como pseudocódigo lê e escreve um arquivo de texto, linha por linha.
Por que arquivos
- Variáveis vivem na RAM e desaparecem quando o programa acaba. Um arquivo em armazenamento secundário 辅助存储器 mantém dados entre execuções de programas: persistência 持久性.
- Arquivos permitem que a saída de um programa seja a entrada de outro, para que os dados possam ser compartilhados.
- Um arquivo pode conter mais do que cabe na memória, e um programa pode reiniciar a partir de um estado salvo.

A variável foi embora no fim da execução; o arquivo ainda está lá amanhã
Por que um programa escreve dados em um arquivo em vez de mantê-los em uma variável?
RAM é volátil, então os dados são perdidos na saída. Um arquivo em armazenamento secundário persiste entre execuções.
Arquivos de texto e os três modos
- Um arquivo de texto 文本文件 armazena dados como linhas de caracteres, que um programa lê e escreve uma linha de cada vez, do início. Essa sequência de linhas é o que permite que um loop processe o conteúdo.
OPENFILE … FOR READlê da primeira linha.FOR WRITEcria um novo arquivo, ou sobrescreve um existente.FOR APPENDadiciona novas linhas no fim, mantendo o que há.- Abra antes de usar, feche depois. Um arquivo tem apenas um modo por vez.
Correlacione cada modo de abertura de arquivo com o que ele faz.
READ lê; WRITE substitui do zero; APPEND adiciona ao final sem perder o que está lá.
Para adicionar linhas ao final de um arquivo existente sem perder seu conteúdo, abra-o FOR ____.
WRITE começaria o arquivo vazio. APPEND mantém o que está lá e escreve após ele.
Lendo cada linha
OPENFILE "data.txt" FOR READ
WHILE NOT EOF("data.txt") DO
READFILE "data.txt", LineString
OUTPUT LineString
ENDWHILE
CLOSEFILE "data.txt"
EOFtesta o fim de arquivo 文件结束. Teste antes de cada leitura; ler além do final é um erro.CLOSEFILEimporta: dados em buffer podem ser perdidos e outros programas bloqueados ao deixar um arquivo aberto.
Gerenciamento de arquivo: abrir → usar → fechar
Passe pelo ciclo de vida que todo arquivo segue. As duas partes fáceis de esquecer são testar EOF ao ler em um laço e sempre fechar no final.
O que EOF testa?
EOF (fim de arquivo) é verificado antes de cada leitura para que o laço pare quando não houver mais dados.
Por que você deve sempre fechar um arquivo após usá-lo?
Fechar grava writes bufferadas em disco e libera o bloqueio para que outros programas possam usar o arquivo.
Escrevendo linhas
OPENFILE "log.txt" FOR WRITE
FOR i ← 1 TO 100
WRITEFILE "log.txt", "Event " & NUM_TO_STR(i)
NEXT i
CLOSEFILE "log.txt"
WRITEinicia o arquivo vazio. Para adicionar a um registro que deve manter seu histórico, abra-oFOR APPENDem vez disso.- Um arquivo de texto contém strings: um número é convertido com
NUM_TO_STRna saída.
Exemplo resolvido: as últimas três linhas de um arquivo
- Escreva um procedimento
LastLines(FileName)que exiba as últimas três linhas de um arquivo de texto, na ordem.
PROCEDURE LastLines(BYVAL FileName : STRING)
DECLARE LineX, LineY, LineZ : STRING
LineX ← ""
LineY ← ""
LineZ ← ""
OPENFILE FileName FOR READ
WHILE NOT EOF(FileName) DO
LineX ← LineY
LineY ← LineZ
READFILE FileName, LineZ
ENDWHILE
CLOSEFILE FileName
OUTPUT LineX
OUTPUT LineY
OUTPUT LineZ
ENDPROCEDURE
- Cada nova linha empurra as anteriores, então em
EOFas três variáveis contêm as últimas três linhas; um arquivo mais curto exibe strings vazias. Para as cinco primeiras linhas, conte as leituras e pare em cinco ou emEOF, o que ocorrer primeiro. Um arquivo vazio tornaEOFverdadeiro imediatamente após abrir.
Coloque as etapas do procedimento LastLines em ordem.
Inicialize, abra, faça o laço com o deslocamento antes da leitura,file, exiba. Deslocar após a leitura perderia a nova linha.
Campos em uma linha
- Um registro é escrito como uma linha, seus campos unidos por um caractere separador 分隔符, e cada número ou Boolean convertido com
NUM_TO_STR(e lido novamente comSTR_TO_NUM, ou comparando com"TRUE"). - Escolha um separador que possa nunca aparecer nos dados: uma vírgula ou
|para nomes e números; nunca um espaço quando um nome pode conter um. - Ler novamente: leia a linha, divida-a no separador, converta cada campo para seu tipo, armazene-o no registro.

Junte com um separador para escrever; divida e converta para ler
Uma linha armazena o nome completo e a pontuação de um jogador. Qual separador é a escolha mais segura?
O separador nunca deve ocorrer dentro de um campo. Um nome completo contém um espaço, e uma pontuação contém dígitos.
Um INTEGER pode ser escrito diretamente em um arquivo de texto, sem convertê-lo para string primeiro.
Um arquivo de texto segura linhas de caracteres. Converta com NUM_TO_STR para escrever e STR_TO_NUM para ler de volta.
Exemplo resolvido: salvar um registro, carregá-lo de volta
- Um registro
Playertem camposName : STRINGeScore : INTEGER. Escreva pseudocódigo para anexá-lo ascores.txtcomo uma linha, e para ler uma linha de volta para o registro.
OPENFILE "scores.txt" FOR APPEND
WRITEFILE "scores.txt", Player.Name & "," & NUM_TO_STR(Player.Score)
CLOSEFILE "scores.txt"
OPENFILE "scores.txt" FOR READ
READFILE "scores.txt", Line
Pos ← POSITION(Line, ",")
Player.Name ← LEFT(Line, Pos - 1)
Player.Score ← STR_TO_NUM(MID(Line, Pos + 1, LENGTH(Line) - Pos))
CLOSEFILE "scores.txt"
- As notas: o modo correto, a conversão do número em ambas as direções, um separador que não pode ocorrer em um nome, e ambos os arquivos fechados.
Para armazenar um registro como uma linha de um arquivo de texto, um programa deve: selecione todos que se aplicam.
Converter, juntar, escrever, file. Um arquivo de texto não tem layout binário; isso é o que um arquivo binário faria.
Acesso serial e direto
- Um arquivo de texto é serial 顺序 (sequencial): ele é lido na ordem do início, então encontrar uma linha significa ler todas as linhas anteriores.
- O acesso direto (aleatório) salta diretamente para um registro em uma posição calculada sem ler os outros; precisa de registros de comprimento fixo, que arquivos de texto não têm.
- Para o currículo, o loop de arquivo de texto acima é o modelo: abra, teste
EOF, leia, feche.
Acesso direto (aleatório) permite que um programa pule diretamente para um registro sem ler os outros primeiro.
Acesso serial deve ler do início.
Marcas que escapam
- Ler além do final. Teste
EOFantes de cadaREADFILE. - Abrir
FOR WRITEquando o arquivo deve manter seu conteúdo. Isso éAPPEND. - Escrever um número sem
NUM_TO_STR, ou lê-lo de volta semSTR_TO_NUM. Um arquivo de texto contém strings. - Esquecer
CLOSEFILE, ou usar um arquivo antes deOPENFILE. Ambos perdem a nota pelo manuseio de arquivos.
Entendeu?
- arquivos dão persistência: dados sobrevivem ao fim do programa, podem ser compartilhados e podem exceder a memória
OPENFILE … FOR READ | WRITE | APPEND→READFILE/WRITEFILE→CLOSEFILE;WRITEsobrescreve,APPENDadiciona no final- teste
EOFantes de cada leitura; converta números comNUM_TO_STRpara fora eSTR_TO_NUMde volta - um registro = uma linha, campos unidos por um separador que nunca aparece nos dados