Você está na página 1de 9

Operações em Arquivos

MC102 – Felipe Bergo
Arquivos
O sistema de arquivos é uma abstração para as memórias
secundárias do computador: discos, fitas, CDs.

Há uma hierarquia de diretórios e cada diretório pode conter
arquivos.

Um arquivo é uma seqüência ordenada de bytes.
Acesso a Arquivos em C
Abertura e Fechamento de Arquivos

Antes de acessar os dados dentro de um arquivo é necessário abri­lo.
Ao terminar de realizar as operações no arquivo, devemos fechá­lo.
As operações de abertura e fechamento garantem a integridade dos dados.

As funções referentes a arquivos requerem a inclusão do stdio.h, e todo
arquivo aberto é referenciado por um ponteiro para o tipo FILE.
Acesso a Arquivos em C
Abertura e Fechamento de Arquivos
FILE * fopen(char *nome, char *modo);

Abre o arquivo nome com o modo dado. O nome deve ser uma
string, que pode incluir um caminho completo. O separador de
diretórios depende do sistema. No Windows,  "C:\\temp\\arquivo" é um
nome válido. No Linux, "/bin/ls" é um nome válido.

O modo é uma string que indica se o arquivo será aberto para leitura,
escrita, ambos, ou variações.

Modo "r" – apenas leitura
Modo "w" – apenas escrita, truncando o arquivo
Modo "a" – apenas escrita, mantem os dados originais e posiciona
cursor ao final do arquivo. 
Modo "r+" – leitura e escrita, mantendo os dados originais.

Modo "w+" – leitura e escrita, truncando o arquivo.  
Acesso a Arquivos em C
Abertura e Fechamento de Arquivos
FILE * fopen(char *nome, char *modo);

Se a abertura falhar, fopen retora NULL.

int fclose(FILE *f);

Fecha um arquivo aberto. Retorna 0 em caso de sucesso, outro valor em caso
de erro (como tentar fechar um arquivo que não está aberto).
Acesso a Arquivos em C
Leitura de Dados
C provê funções para ler caracteres, linhas de texto, padrões formatados ou
vetores de bytes:

int fgetc(FILE *f)
lê um byte, retorna seu valor (0­255) como inteiro. Retorna EOF em caso de
erro.
char *fgets(char *dest, int limite, FILE *f);
lê uma linha de texto (ou até atingir o limite de bytes lidos) e guarda o texto
lido em dest. Retorna dest em caso de sucesso, NULL em caso de erro.
int fscanf(FILE *f, char *formato, ...);
scanf para arquivos.
int fread(void *dados, int tam_elem, int num_elem, FILE *f);
lê num_elem elementos de tam_elem bytes cada e armazena em dados.
Retorna o número de elementos lidos com sucesso.
Acesso a Arquivos em C
Escrita de Dados
C provê funções para escrever caracteres, strings, padrões formatados ou
vetores de bytes:

int fputc(int c, FILE *f)
Escreve o byte c. Retorna EOF em caso de erro.
int fputs(char *dest, FILE *f);
Escreve a string dest (que deve ter o zero terminador) no arquivo. Retorna EOF em caso
de erro.
int fprintf(FILE *f, char *formato, ...);
printf para arquivos.
int fwrite(void *dados, int tam_elem, int num_elem, FILE *f);
Escreve num_elem elementos de tam_elem bytes cada, armazenados em dados.
Retorna o número de elementos escritos com sucesso.
Acesso a Arquivos em C
Posicionamento do Cursor
Em todo arquivo aberto há um "cursor" indicando a posição onde ocorrerá
a próxima leitura e/ou escrita. Todas as operações de leitura e escrita
avançam o cursor após ler/escrever os dados. Para mover o cursor, ou
obter sua posição atual, temos:

int fseek(FILE *f, long distancia, int origem);
Move o cursor do arquivo f para a posição distancia relativa a alguma origem. A origem
deve ser uma destas 3 constantes:
SEEK_SET – início do arquivo
SEEK_CUR – posição atual
SEEK_END – fim do arquivo
fseek retorna 0 em caso de sucesso, ­1 em caso de erro.

long ftell(FILE *f);
Retorna a posição atual do cursor no arquivo f.
Acesso a Arquivos em C
Exemplo
#include <stdio.h>

// conta o número de espaços em todos os arquivos passados na


// linha de comando
int main(int argc, char **argv) {
FILE *f;
int i,c,soma;
for(i=1;i<argc;i++) {
f = fopen(argv[i],"r");
if (f==NULL) continue;
soma = 0;
while ((c=fgetc(f))!=EOF)
if (c==' ') soma++;
fclose(f);
printf("%s: %d espacos\n",argv[i],soma);
}
return 0;
}

Você também pode gostar