OPERAÇÕES COM ARQUIVOS EM C/C OPERAÇÕES COM ARQUIVOS EM C/C++
Roteiro da Aula
ote o da u a
S UMMObjetivos
I NTObjet os
T RODU ÇÃO Conhecer os aspectos básicos de operações com arquivos Dominar o processo de descrição e solução de problemas através do desenvolvimento deproblemas através do desenvolvimento de programas de computador que manipulam arquivos
Arquivos na linguagem de programação C
qu os a
guage
de p og a ação C
I NTTRODU
Armazenar dados em disco sistema de entrada/saída na linguagem de ÇÃO
programação C é único porque os dados podem ser transferidos na sua representação binária interna ou em um formato de texto legível por humanos. Isso torna fácil criar arquivos que satisfaçam qualquer necessidade
• Exemplo de um arquivo texto: ABC\n ABC\n ABCDEF\n \n ABCDEFGH\n EOF
• Observações:Observações: EOF End Of File (fim do arquivo).EOF – End Of File (fim do arquivo)
• Nome do arquivo: 8 caracteres (nome) + 3 caracteres (extensão). • Exemplos: turboc.txt, turboc.tex, turboc.doc
Principais Funções
M Ac pa s u ções
NI PU LL AÇÃO DE AR QUI V OO SStreams e Arquivos
M ASt ea s e
qu os
NI PU LL AÇÃO O sistema de E/S da linguagem de programação
C fornece uma interface consistente ao
DE
AR
programador que utiliza a linguagem de
programação C, independentemente do QUI
V
O
dispositivo real que é acessado
Este sistema (que é uma abstração) é chamado O
S
(q ç )
de stream e o dispositivo real é chamado de
arquivoq
OBS: Na linguagem de programação C, todos os dispositivos são encarados como arquivos
Streams
M ASt ea s
NI PU L Todas as streams comportam‐se de forma L
AÇÃO
Todas as streams comportam se de forma semelhante
Pelo fato das streams serem totalmente DE
AR
Pelo fato das streams serem totalmente independentes do dispositivo, a mesma função pode
escrever em um arquivo em disco ou em algum QUI
V
O
q g
outro dispositivo, como o console
Na linguagem de programação C, um arquivo pode O
S
g g p g ç , q p
ser qualquer coisa, desde um arquivo em disco até um terminal ou uma impressora
Uma vez o arquivo aberto, informações podem ser trocadas entre ele e o seu programa
Ponteiro de Arquivo
M Ao te o de
qu o
NI PU L Um ponteiro de arquivo é um ponteiro para L
AÇÃO
informações que definem várias coisas sobre o arquivo: nome, status e a posição atual do
DE
AR
arquivo
Um ponteiro de arquivo é uma variável ponteiro QUI
V
O
do tipo FILE
Para ler ou escrever arquivos, seu programa O
S
Para ler ou escrever arquivos, seu programa precisa usar ponteiros de arquivo. Para obter uma variável ponteiro de arquivo, use o uma variável ponteiro de arquivo, use o comando:
FILE *fp; FILE fp;
Abertura de Arquivo
M Abe tu a de
qu o
NI PU L A f ã f (fil ) it b i i LAÇÃO A função fopen (file open) permite abrir um arquivo ligando‐o a uma fila de bytes. DE ARFILE fopen(const char* nomearq, const char* modo*);
QUI
V
O
• Prototype: stdio.h
• nome arquivo: Deve ser uma string que OS
• nome_arquivo: Deve ser uma string que
contenha: "drive:\path\nome_do_arquivo“
d É t i té
• modo: É uma string que contém as
Abrindo um Arquivo
M Ab
do u
qu o
NI PU LL AÇÃO Confirmar o sucesso de fopen( ) antes de tentar
qualquer outra operação sobre o arquivo DE
AR
qualquer outra operação sobre o arquivo
Se utilizar fopen( ) para abrir um arquivo com
i ã it l i já QUI
V
O
permissão para escrita, qualquer arquivo já existente com esse nome será apagado e um
i á i i i d OS
novo arquivo será iniciado
Se nenhum arquivo com este nome existe, um será criado
Abrindo um Arquivo
M Ab
do u
qu o
NI PU LL AÇÃO Se desejar adicionar algum conteúdo no final do
arquivo deve usar o modo "a" DE
AR
arquivo, deve usar o modo a
Arquivos já existentes só podem ser abertos para
õ d l it d " " QUI
V
O
operações de leitura, modo "r"
Se um arquivo é aberto para operações de O
S
leitura/escrita, ele não será apagado caso já exista e, senão existir, ele será criado (modo "r+")
Exemplo (abertura de arquivo)
M Ae p o (abe tu a de a qu o)
NI PU LL AÇÃO DE AR Para abrir um arquivo chamado arquivo1,
permitindo escrita, pode‐se utilizar: QUI
V O pe do esc a, pode se u a FILE *fp; OS FILE fp; fp = fopen( “arquivo1”, “w”);
Exemplo (abertura de arquivo)
M Ae p o (abe tu a de a qu o)
NI PU L Uma maneira mais “profissional” de escrever o L
AÇÃO
trecho anterior é:
DE
AR
FILE *fp;
if((fp = fopen( “arquivo1”, “w”)) == NULL )
{ QUI
V
O
printf(“nao foi possivel criar o arquivo\n”); exit(1);
} OS
}
Neste segundo caso qualquer erro na abertura do Neste segundo caso, qualquer erro na abertura do arquivo será detectado (o disco está cheio ou protegido contra gravação)
Abrindo um Arquivo com Nome Fornecido
M Aq
NI PU LL AÇÃO FILE *fp;char nome arq[50]; DE
AR
_ q[ ];
printf(“entre com o nome do arquivo\n”);
gets(nome arq); QUI
V
O
gets(nome_arq);
if((fp = fopen( nome_arq, “r”)) == NULL )
{ OS
{
printf(“nao foi possivel abrir o arquivo %s\n”,nome_arq); exit(1);
} }
Abrindo um Arquivo com Nome Fornecido
M Aq
NI PU L #define MAX 120 *f L AÇÃO FILE *fp;char nome_arq[50], linha[120];
DE
AR
printf(“entre com o nome do arquivo\n”); gets(nome_arq);
if((fp = fopen( nome_arq, “r”)) == NULL )
QUI
V
O
{
printf(“nao foi possivel abrir o arquivo %s\n”, nome_arq);
exit(1); O
S
}
while ( fgets(linha,MAX,fp) != NULL ) {
// aqui fica o processamento de cada linha printf(“%s”, linha );
Fechamento de Arquivos
M Aec a e to de
qu os
NI PU LL AÇÃO Um arquivo é desassociado de uma stream
específica por meio de uma operação de DE
AR
p p p ç
fechamento
Se um arquivo aberto para saída for fechado, o QUI
V
O
Se um arquivo aberto para saída for fechado, o conteúdo, da sua stream associada será escrito
no dispositivo externo. Este processo é OS no dispositivo externo. Este processo é
geralmente referido como descarga (flushing) da stream e garante que nenhuma informação seja stream e garante que nenhuma informação seja acidentalmente deixada no buffer do disco
Fechamento de Arquivos
M Aec a e to de
qu os
NI PU LL AÇÃO DE AR Todos os arquivos são fechados automaticamente quando o programa termina
QUI
V
O
normalmente, com
• main( ) retornando ao sistema operacional ou
h d it( )
O
S
• uma chamada a exit( )
f h d d b ( h)
Os arquivos não são fechados quando um programa quebra (crash) ou quando ele chama abort( ).
Fechando um Arquivo
M Aec a do u
qu o
NI PU LL AÇÃO A função fclose( ) fecha uma stream que foi DE
AR
A função fclose( ) fecha uma stream que foi aberta por meio de uma chamada a fopen( )
l l d d d QUI
V
O
Ela escreve qualquer dado que ainda permanece no buffer de disco no arquivo e, então, fecha
l í l d
O
S
normalmente o arquivo em nível de sistema operacional
Fechando um Arquivo
M Aec a do u
qu o
NI PU LL AÇÃO Um fclose( ) também libera o bloco de controle DE
AR
( )
de arquivo associado à stream, deixando‐o
disponível para reutilização QUI
V
O
Em muitos casos, há um limite do sistema
operacional para o número de arquivos abertos OS operacional para o número de arquivos abertos
simultaneamente, assim, deve‐se fechar um arquivo antes de abrir um outro
Fechando um Arquivo
M Aec a do u
qu o
NI PU L A função fclose( ) tem o seguinte protótipo: L
AÇÃO
fclose(FILE *fp);
onde fp é o ponteiro de arquivo devolvido pela chamada a
DE
AR
fopen( ).
Um valor de retorno zero significa uma operação de
f h b d d QUI
V
O
fechamento bem sucedida
Qualquer outro valor indica um erro O
S
A função padrão ferror( ) pode ser utilizada para determinar e informar qualquer problema
G l t f l ( ) f lh á d di ti id
Geralmente, fclose( ) falhará quando um disco tiver sido retirado prematuramente do acionador ou não houver mais espaço no disco
Gravando um Arquivo
M Aq
NI PU Lint main(int argc, char *argv[]) { FILE *arquivo; L AÇÃO char caracter; if(argc < 2) {
printf("\nErro: Digite o nome do arquivo !!!\n\n");
DE
AR
exit(1); }
if((arquivo = fopen(argv[1],"w")) == NULL)
{ QUI
V
O
printf("Erro ao abrir arquivo!!!\n\n"); exit(1); } do O S { caracter = getchar(); putc(caracter,arquivo); } } while(caracter != '$'); fclose(arquivo);
printf("\nGravado com sucesso em %s\n\n",argv[1]); return(0);
return(0); }
Posicionamento
M Aos c o a e to
NI PU L Pode‐se apontar para um byte específico dentro do arquivo L
AÇÃO
movimentando o indicador de posição. Isto pode ser feito com o uso da função fseek( ), cuja sintaxe é:
fseek(ARQUIVO, NÚMERO DE BYTES, ORIGEM); DE
AR
fseek(ARQUIVO, NÚMERO_DE_BYTES, ORIGEM);
onde ARQUIVO é um ponteiro de arquivo aberto anteriormente, NÚMERO_DE_BYTES é a quantidade de bytes que o indicador de posição
á i d é i d d i d i di d QUI
V
O
será movimentado e ORIGEM é a partir de onde o movimento do indicador de posição iniciará
O
S
Para apontar para o início do arquivo use a função rewind( ), cujo protótipo está no arquivo de cabeçalho stdio.h. Sua sintaxe é:
i d( Q O)
rewind(ARQUIVO); sendo ARQUIVO um ponteiro de arquivo.
Referências Bibliográficas
M Ae e ê c as
b og á cas
NI PU L Ascêncio, Ana Fernanda Gomes e Campos, Edilene Aparecida L
AÇÃO
Veneruchi de. Fundamentos de Programação de
Computadores: Algoritmo, Pascal e C/C++. Inclui CD‐ROM com
í i l id Sã P l P i H ll 2002 DE
AR
exercícios resolvidos. São Paulo, Prentice‐Hall, 2002.
Forbellone, André Luiz Villar e Ebberspacher, Henry
Frederico Lógica de QUI
V
O
Frederico. Lógica de
Programação. São Paulo, Makrom Books, 1999.
S hildt H b t T b C G i d U á i Edit M G OS
Schildt, Herbert. Turbo C: Guia do Usuário, Editora: McGraw‐ Hill
Luzzardi Paulo Roberto Linguagem C Universidade Católica Luzzardi, Paulo Roberto. Linguagem C. Universidade Católica de Pelotas, 2006.