Capítulo 9: Comandos de Entrada/Saída

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.