O sistema de E/S
Pesquisas Acadêmicas: O sistema de E/S. Pesquise 862.000+ trabalhos acadêmicosPor: judasprist • 7/4/2013 • Pesquisas Acadêmicas • 4.220 Palavras (17 Páginas) • 398 Visualizações
[ Voltar ] [ Índice ] [ Avançar ]
11. Arquivos
11.1 Introdução
O sistema de E/S de C utiliza o conceito de streams e arquivos. Uma stream é um dispositivo lógico que representa um arquivo ou dispositivo. A stream é independente do arquivo ou dispositivo. Devido a isso, a função que manipula uma stream pode escrever tanto em um arquivo no disco quanto em algum outro dispositivo, como o monitor.
Existem dois tipos de streams: de texto e binária.
Em uma stream de texto podem ocorrer certas traduções de acordo com o sistema hospedeiro. Por exemplo, um caracter de nova linha pode ser convertido para os caracteres retorno de carro e alimentação de linha. Devido a isso pode não haver uma correspondência entre os caracteres da stream e do dispositivo externo; a quantidade de caracteres pode não ser a mesma.
A stream binária é uma sequência de bytes com uma correspondência de um para um com os bytes encontrados no dispositivo externo, isto é, não ocorre nenhuma tradução de caracteres. O número de bytes é o mesmo do dispositivo.
Um arquivo é interpretado pela linguagem C como qualquer dispositivo, desde um arquivo em disco até um terminal ou uma impressora. Para utilizar um arquivo você deve associá-lo a uma stream e, então, manipular a stream. Você associa um arquivo a uma stream através de uma operação de abertura.
Nem todos os arquivos tem os mesmos recursos. Por exemplo, um arquivo em disco pode suportar acesso aleatório enquanto um teclado não.
Do que foi até aqui exposto concluímos que todas as streams são iguais, mas não todos os arquivos.
Se o arquivo suporta acesso aleatório, abrí-lo inicializa o indicador de posição apontando para o começo do arquivo. Quando cada caracter é lido ou escrito no arquivo, o indicador de posição é incrementado.
Um arquivo é desassociado de uma stream através de uma operação de fechamento. Se um arquivo aberto para saída por fechado, o conteúdo de sua stream será escrito no dispositivo externo. Esse processo é geralmente chamado de descarga (flushing) da stream e garante que nenhuma informação seja acidentalmente deixada no buffer de disco.
A stream associa o arquivo a uma estrutura do tipo FILE. Esta estrutura é definida no arquivo de cabeçalho stdio.h
11.2 Funções utilizadas para manipulação de arquivos
As principais funções para manipulação de arquivos são:
FUNÇÃO FINALIDADE
fopen( ) Abrir um arquivo
fclose( ) Fechar um arquivo
putc( ) Escrever um caracter em um arquivo
fputc( ) Idem putc( )
getc( ) Ler um caracter de um arquivo
fgetc( ) Idem getc( )
fseek( ) Posicionar o ponteiro de arquivo num byte específico
fprintf( ) É para o arquivo o que printf é para o console
fscanf( ) É para o arquivo o que scanf é para o console
feof( ) Devolve verdadeiro se o fim do arquivo foi atingido
ferror( ) Devolve verdadeiro se ocorreu um erro
rewind( ) Posicionar o ponteiro de arquivo no início deste
remove( ) Apagar um arquivo
fflush( ) Descarregar um arquivo
Todas estas funções estão no arquivo de cabeçalho stdio.h.
Este arquivo de cabeçalho define três tipos: size_t, fpos_t e FILE. Os dois primeiros são o mesmo que unsigned e o terceiro é discutido mais abaixo.
Este arquivo de cabeçalho também define várias macros. As importantes para a manipulação de arquivos são: NULL, EOF, FOPEN_MAX, SEEK_SET, SEEK_CUR e SEEK_END.
NULL define um ponteiro nulo.
EOF geralmente é definida como -1 e devolve este valor quando uma função de entrada tenta ler além do final do arquivo.
FOPEN_MAX define um valor inteiro que determina o número de arquivos que podem ser abertos ao mesmo tempo.
SEEK_SET, SEEK_CUR e SEEK_END são usadas com a função fssek( ) para o acesso aleatório a um arquivo.
11.3 O ponteiro de arquivo
Basicamente um ponteiro de arquivo identifica um arquivo específico e é usado pela stream para direcionar as operações das funções de E/S. Um ponteiro de arquivo é uma variável ponteiro do tipo FILE. Esta variável é um tipo pré-definido pela linguagem C. Normalmente ela é definida no arquivo de cabeçalho stdio.h, mas isso depende do seu compilador. Para ler ou escrever em arquivos seu programa precisa usar os poteiros de arquivo. Para declarar uma variável como ponteiro de arquivo use a seguinte sintaxe:
FILE *arquivo;
11.4 Abrindo um arquivo
Apesar do sistema de E/S de C considerar arquivo como qualquer dispositivo, para os conceitos apresentados daqui pra frente, consideraremos arquivo como um arquivo em disco.
Para abrir uma stream e associá-la a um arquivo você usa a função fopen( ) ,cuja sintaxe é:
fopen(ARQUIVO,MODO)
Onde ARQUIVO é um ponteiro para uma string que representa o nome do arquivo. Na prática é o nome do arquivo propriamente dito e pode ser um PATH, ou seja, algo como "C:\docs\arquivo.txt", no windows; ou algo como "/home/samu/arquivo.txt" no linux. MODO é uma string que representa como o arquivo será aberto de acordo com a tabela abaixo:
MODO COMO O ARQUIVO SERÁ ABERTO
r Abre um arquivo texto para leitura.
w Abre um arquivo texto para escrita. Se um arquivo com o mesmo nome existir, será sobrescrito.
a Abre um arquivo texto para anexação. Se o arquivo não existir, será criado.
rb Abre
...