9.1. Introdução
[D] Os "Comandos de Entrada" fornecem um
método de transferir dados de um dispositivo periférico (como
um teclado) ou de um arquivo interno para a memória principal. Este
processo é chamado de "leitura de dados".
[D] Os "Comandos de Saída" fornecem
um meio de transferir dados da memória principal para um dispositivo
periférico (como um monitor de vídeo ou impressora) ou um
arquivo interno. Este processo é chamado de "escrita" ou "gravação"
de dados.
[C] Alguns comandos de E/S permitem que
se edite os dados durante a sua transferência.
[D] Neste capítulo somente serão apresentados os comandos de E/S que transferem dados (READ, PRINT, WRITE). Comandos auxiliares não serão discutidos.
9.2. Registros, Arquivos e Unidades
[D] Um "caractere" é um único
símbolo, tal como a letra z, o dígito
4 ou
um asterisco *.
[D] Um "campo" é uma sucessão
de caracteres, que representa alguma informação, tal como
ANTONIO
ou 128.47.
[D] Um "registro" é um grupo de campos que reúne informações sobre um único item, tal como:
ANTONIO 26-01-1937
6543.21
(nome)
(data nasc.) (salário)
[D] Um "arquivo" é um grupo de registros,
tal como:
A | N | T | O | N | I | O | 2 | 6 | - | 0 | 1 | - | 1 | 9 | 3 | 7 | 6 | 5 | 4 | 3 | . | 2 | 1 | |||
A | R | N | A | L | D | O | 2 | 2 | - | 1 | 0 | - | 1 | 9 | 4 | 5 | 9 | 8 | 7 | . | 6 | 5 | ||||
M | . | C | R | I | S | T | I | N | A | 0 | 7 | - | 0 | 9 | - | 1 | 9 | 4 | 2 | 1 | 2 | 3 | 4 | . | 5 | 6 |
Temos acima um arquivo, com
três
registros, cada registro com três campos e comprimento total
de 27 caracteres.
[C] Cada comando de E/S opera sobre um único registro.
[D] Uma unidade de E/S é um meio de se referir a um arquivo.
Usa-se números de unidades de E/S para distinguir um arquivo de
outro.
[C] Certos números de unidades podem ser pré-definidos.
Assim, por exemplo, o número 5 pode indicar o teclado e 6 pode indicar
o monitor de vídeo.
[C] O comando OPEN estabelece a conexão entre o número
da unidade e um particular arquivo.
9.3. Componentes dos Comandos de E/S
[C] Os comandos de E/S são constituídos de 3 partes:
comando (especificadores) [lista]
sendo que:
9.3.1. Lista de Especificadores de Controle de
E/S
[C] Existem muitos especificadores de controle de entrada e saída.
Veremos somente os mais importantes para o iniciante.
[D] UNIT: o especificador de unidade designa a unidade externa de E/S ou o arquivo interno a ser usado para o comando de E/S no qual ele aparece. Seu uso é:
[unit=]u ou [unit=]*
sendo que:
- "u" é uma expressão inteira que designa o número
de E/S.
- "*" designa a unidade de entrada padrão em READ e saída
padrão em PRINT ou WRITE.
[C] Os caracteres "unit=" somente podem ser omitidos no caso do especificador
de unidade ser o primeiro na lista de especificadores.
[D] FMT: o especificador de formato designa o formato a ser usado para o comando de E/S formatado ou o comando de E/S com lista direta. Seu uso é
[fmt=]f ou [fmt=]*
sendo que:
- "f" é um identificador de formato;
- "*" designa uma formatação
em lista direta.
[C] Os caracteres "fmt=" somente podem
ser omitidos se o especificador de formato for o segundo especificador
e ainda o primeiro especificador for o de unidade sem os caracteres "unit="
.
[D] O identificador de formato "f" pode
ser um número de um comando FORMAT. Ou uma expressão inteira
(que acaba por indicar um comando FORMAT). Ou especificações
de formato (em forma de variável caractere).
[E] Exemplos. Todos eles fazem a mesma coisa e ainda o comando READ poderia ser substituído pelo comando WRITE.
Exemplo 1:
read(unit=1,fmt=100)
a,b
100 format(i5,f10.3)
Exemplo 2:
read(1,100) a,b
100 format(i5,f10.3)
Exemplo 3:
read(1,*) a,b
9.3.2. Lista de E/S
[D] Uma lista de E/S tem a forma:
s[,s]…
sendo que "s" é uma lista de itens
simples ou uma lista de DO implícito.
[C] Um item da lista pode ser um nome de
variável, um nome de conjunto, um nome de elemento de conjunto,
um nome de subcadeia caractere ou uma lista de DO implícito. No
caso de lista de saída, ainda pode ser uma expressão.
[E] Exemplos de listas de E/S (sem DO implícito):
read(5,100) A,B,C,D
read(3,20) X,Y,C(J),D(3,4),E(I,K,7),T
read(4,121)I,A(I),J,B(I,J)
write(2,302) ALFA,BETA
write(6,122) GAMA(4*J+2,5*I+2,4*K),C,D(L)
[E] Registro de entrada contendo os dados L, M e N, que são definidos como números inteiros:
100223456789
que é lido pelos comandos:
read(5,60) L,M,N
60 format(I3,I2,I7)
apresentará os seguintes valores:
L=100
M=22
N=3456789 .
[CF] Uma lista de DO implícito tem a seguinte forma:
(d , i = e1, e2 [,e3] )
sendo que:
- "d" é uma lista de E/S.
- i , e1, e2 e e3 têm as mesmas
formas, funções e efeitos que num comando DO.
[E] Ao invés de usar:
print *, A(1),A(2),A(3),A(4),A(5),A(6),A(7),A(8),A(9)
use
print *, (A(i), i =
1,9) .
9.4. Comandos READ
[D] Os comandos READ transferem dados de
entrada para a memória de trabalho.
[C] IMPORTANTE: cada novo comando READ
passa a ler dados em uma nova linha.
9.4.1. Comandos READ seqüenciais
[CF] As formas aceitas dos comandos READ seqüencial são:
read([unit=]u,[fmt=]f) [lista]
ou
read f [, lista]
sendo que "f" pode ser substituído
por "*" para designar uma lista direta. Se "u" for substituído por
"*" , a leitura será feita na unidade de entrada padrão.
[E] Exemplos:
read(unit=3,fmt=100) a,b,c
100 format(3f5.2)
é igual a:
read(3,100) a,b,c
100 format(3f5.2)
que ainda podem ser simplificados para:
read(3,*) a,b,c
(lista direta)
ou
read(*,*) a,b,c
(aqui a leitura passa
a ser feita a partir da entrada padrão)
9.5. Comandos WRITE (PRINT)
[D] Os comandos WRITE (PRINT) transferem
dados armazenados na memória do computador para dispositivos de
saída (vídeo, arquivos ou impressora).
[C] IMPORTANTE: cada novo comando WRITE
(PRINT) passa a escrever dados em uma nova linha.
9.5.1. Comandos WRITE (PRINT) seqüenciais
[CF] As formas aceitas dos comandos WRITE seqüencial são:
write([unit=]u,[fmt=]f) [lista]
sendo que "f" pode ser substituído
por "*" para lista direta.
[E] Exemplos:
write(unit=7,fmt=200) a,b,c
200 format(3f5.2)
ou
write(7,200) a,b,c
200 format(3f5.2)
(igual ao comando anterior)
ou
write(7,200) a,b,c
200 format(3f5.2)
(praticamente igual aos comandos anteriores)
ou
write(*,*) a,b,c
(escreve na saída padrão)
[C] A diferença entre WRITE e PRINT
é que este último somente escreve na saída padrão
(o vídeo, no nosso caso). Por isso PRINT dispensa o especificador
de unidade.
[CF] A forma aceita do comando PRINT é:
print f [, lista]
sendo que "f" pode ser substituído
por "*" para lista direta.
[E] Exemplos:
print 200, a,b,c
200 format(3f5.2)
ou
print *, a,b,c
(lista direta)
9.6. Comandos de Condição de Arquivos de E/S
9.6.1. Comando OPEN
[C] O comando OPEN serve para inicializar
um arquivo.
[CF] A forma geral simplificada do comando OPEN é:
open([unit=]u[,file='a'][,status='b'])
sendo que:
- "u" é o número da unidade.
- 'a' é uma expressão caractere
que especifica o nome do arquivo;
- 'b' especifica a condição
do arquivo, que pode ser:
-'NEW', para arquivos
novos, que vão ser criados pelo programa;
-'OLD', para arquivos
já existentes (em geral, arquivos de entrada de dados);
-'SCRATCH', para arquivos
que são criados pelo programa e que devem ser apagados no final
da execução deste.
- 'UNKNOWN', para arquivos
para os quais não se aplica nenhuma das condições
acima.
9.6.2. Comando CLOSE
[D] O comando CLOSE serve para finalizar
um arquivo. É o oposto de OPEN.
[CF] A forma geral simplificada do comando CLOSE é:
close([unit=]u)
sendo que "u" é o número
da unidade.