Você está na página 1de 41

Unidade Didtica VIII

ARQUIVOS: Conceituar e Utilizar

Arquivos - Introduo

ARQUIVO :- um conjunto de registros


logicamente organizados armazenados em um
dispositivo de memria secundria (disco rgido,
disquetes, fitas magnticas, cd, etc), onde cada
registro compreende um conjunto de informaes
denominadas campos. Em um arquivo possvel
armazenar um volume grande de dados.

Arquivos - Introduo

sistema de entrada e sada do ANSI C composto


por uma srie de funes, cujos prottipos esto
reunidos em stdio.h . Todas estas funes trabalham
com o conceito de "ponteiro de arquivo". Podemos
declarar um ponteiro de arquivo da seguinte maneira:
FILE *p;
p ser ento um ponteiro para um arquivo. Com este
tipo de ponteiro que podemos manipular arquivos
no C.

Arquivos - Introduo

Quando se comea a execuo de um programa, o


sistema automaticamente abre alguns arquivos prdefinidos:
stdin: disp. de entrada padro (geralmente o teclado)
stdout: disp. de sada padro (geralmente o vdeo)
stderr: disp. sada de erro padro (geralmente o
vdeo)
stdaux: disp. sada auxiliar (p.e. porta serial)
stdprn : disp. impresso padro (p.e. porta paralela)

Arquivos pr-definidos

Cada uma destas constantes pode ser utilizada como


um ponteiro para FILE, para acessar os perifricos
associados a eles. Desta maneira, pode-se, por
exemplo, usar:
ch =getc(stdin);

para efetuar a leitura de um caracter a partir do teclado, ou :

putc(ch, stdout);

para imprim-lo na tela.

Funes de Manipulao de Arquivos


fopen( )
Abrir um arquivo
fclose( )
Fechar um arquivo
putc( )
Escrever um caracter em um arquivo
getc( )
Ler um caracter de um arquivo
feof( )
Devolve verdadeiro se o fim do arquivo foi atingido
remove( )
Apagar um arquivo
fflush( )
Descarregar um arquivo

Funes de Manipulao de Arquivos

Estas funes esto no arquivo de cabealho stdio.h.


Este cabealho define 3 tipos: size_t, fpos_t e FILE.
Define tambm vrias macros, que para a
manipulao de arquivos as mais importantes so:
NULL: define um ponteiro nulo.
EOF: geralmente definida como -1 e devolve este valor quando uma
funo de entrada tenta ler alm do final do arquivo.
FOPEN_MAX: define um valor inteiro que determina o nmero de
arquivos que podem ser abertos ao mesmo tempo.
SEEK_SET, SEEK_CUR e SEEK_END: so usadas com a funo
fseek( ) para o acesso aleatrio a um arquivo.

Funes de Manipulao de Arquivos


fopen

Esta a funo de abertura de arquivos.


FILE *fopen (char *nome_do_arquivo, char
*modo);

O nome_do_arquivo determina qual arquivo dever


ser aberto. Este nome deve ser vlido no sistema
operacional que estiver sendo utilizado. O modo de
abertura diz funo fopen() que tipo de uso voc
vai fazer do arquivo. A tabela abaixo mostra os
valores de modo vlidos:

Funes de Manipulao de Arquivos


Modo Significado
"r"
Abre um arquivo texto para leitura. O arquivo deve existir antes de ser aberto.
"w
Abrir um arquivo texto para gravao. Se o arquivo no existir, ele ser
criado.
Se j existir, o contedo anterior ser destrudo.
"a"
Abrir um arquivo texto para gravao. Os dados sero adicionados no fim do
arquivo ("append"), se ele j existir; ou um novo arquivo ser criado, no caso
de
arquivo no existente anteriormente.
"rb"
Abre um arquivo binrio para leitura. Igual ao modo "r" anterior, s que o
arquivo binrio.
"wb"
Cria um arquivo binrio para escrita, como no modo "w" anterior, s que o
arquivo binrio.
"ab"
Acrescenta dados binrios no fim do arquivo, como no modo "a" anterior, s
que o arquivo binrio.

Funes de Manipulao de Arquivos


Modo Significado
"r+"
Abre um arquivo texto para leitura e gravao. O arquivo deve existir e pode
ser modificado.
"w+ Cria um arquivo texto para leitura e gravao. Se o arquivo existir, o contedo
anterior ser destrudo. Se no existir, ser criado.
"a+"
Abre um arquivo texto para gravao e leitura. Os dados sero adicionados no
fim do arquivo se ele j existir, ou um novo arquivo ser criado, no caso de
arquivo no existente anteriormente.
"r+b" Abre um arquivo binrio para leitura e escrita. O mesmo que "r+" acima, s
que o arquivo binrio.
"w+b Cria um arquivo binrio para leitura e escrita. O mesmo que "w+" acima, s
que o arquivo binrio.
"a+b" Acrescenta dados ou cria uma arquivo binrio para leitura e escrita. O mesmo
que "a+" acima, s que o arquivo binrio

Funes de Manipulao de Arquivos

Poderamos ento, para abrir um arquivo binrio para escrita:


FILE *fp;
/* Declarao da estrutura */
fp=fopen ("exemplo.bin","wb"); /* o arquivo se chama
exemplo.bin e est localizado no diretrio corrente */
if (!fp)
printf ("Erro na abertura do arquivo.");
A condio !fp testa se o arquivo foi aberto com sucesso
porque no caso de um erro a funo fopen() retorna um
ponteiro nullo (NULL).

Funes de Manipulao de Arquivos

Uma vez aberto um arquivo, podemos ler ou escrever


nele utilizando as funes adequadas.
Toda vez que estamos trabalhando com arquivos, h
uma espcie de posio atual no arquivo. Esta a
posio de onde ser lido ou onde ser escrito o
prximo caractere. Normalmente, num acesso
sequencial a um arquivo, no temos que mexer nesta
posio pois quando lemos um caractere a posio no
arquivo automaticamente atualizada. Num acesso
randmico teremos que mexer nesta posio (ver
fseek()).

Funes de Manipulao de Arquivos


fclose

Quando acabamos de usar um arquivo que abrimos,


devemos fech-lo.
int fclose (FILE *fp);

O ponteiro fp passado funo fclose() determina o


arquivo a ser fechado. Ela retorna 0 em caso de
sucesso.

Fechar um arquivo faz com que qualquer caracter que


tenha permanecido no "buffer" associado ao fluxo de
sada seja gravado. A funo exit() fecha todos os
arquivos que um programa tiver aberto.

Funes de Manipulao de Arquivos


putc

A funo putc uma funo de escrita de arquivo.


Ela escreve um caractere no arquivo.
int putc (int ch,FILE *fp);

O programa a seguir l uma string do teclado e


escreve-a, caractere por caractere em um arquivo em
disco (o arquivo arquivo.txt, que ser aberto no
diretrio corrente).

#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *fp;
char string[100];
int i;
fp = fopen("arquivo1.txt","w"); //Arquivo ASCII, para escrita
if(!fp) { //Testa se houve erro na abertura do arquivo => fp==null
printf( "Erro na abertura do arquivo");
exit(0); } //fecha todos os arquivos
printf("Entre com a string a ser gravada no arquivo:");
gets(string);
for(i=0; string[i]; i++) putc(string[i], fp); //Grava a string, caract. a caract.
fclose(fp); //fecha o arquivo apontado por fp
return 0;
}

Funes de Manipulao de Arquivos


getc

Retorna um caractere lido do arquivo.


int getc (FILE *fp);
feof

EOF ("End of file") indica o fim de um arquivo. Para


verificar se um arquivo chegou ao fim podemos usar
a funo feof(): retorna no-zero se o ponteiro
chegou ao fim do arquivo, caso contrrio retorna
zero.
int feof (FILE *fp);

Exemplo com getc e EOF


#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *fp;
char c;
fp = fopen("arquivo.txt","r"); /* Arquivo ASCII, para leitura */
if(!fp) {
printf( "Erro na abertura do arquivo");
exit(0); }
while((c = getc(fp) ) != EOF) /* Enquanto no chegar ao final do arquivo */
printf("%c", c); /* imprime o caracter lido */
fclose(fp);
return 0;
}

Exemplo com getc e feof


#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *fp;
char c;
fp = fopen("arquivo.txt","r"); /* Arquivo ASCII, para leitura */
if(!fp) {
printf( "Erro na abertura do arquivo");
exit(0); }
while(!feof(fp)) { /* Enquanto no chegar ao final do arquivo */
c = getc(fp); /* le o caractere */
printf("%c", c); /* imprime o caracter lido */
}
fclose(fp);
return 0;
}

Funes de Manipulao de Arquivos


fgets

Para se ler uma string num arquivo podemos usar


fgets().
char *fgets (char *str, int tamanho, FILE *fp);

Argumentos: a string a ser lida, o limite mximo de


caracteres a serem lidos e o ponteiro para FILE. A
funo l a string at um caracter de nova linha ou
tamanho-1 caracteres tenham sido lidos. A string
resultante sempre terminar com '\0' (por isto
somente tamanho-1 caracteres, no mximo, sero
lidos).

Funes de Manipulao de Arquivos


fputs

Escreve uma string num arquivo.


char *fputs (char *str,FILE *fp);
ferror() e perror()

A funo retorna zero, se nenhum erro ocorreu e um


nmero diferente de zero se algum erro ocorreu
durante o acesso ao arquivo.
int ferror (FILE *fp);

Funes de Manipulao de Arquivos

ferror(): verificar se cada acesso a um arquivo teve


sucesso. Na maioria dos casos, se um arquivo pode
ser aberto, ele pode ser lido ou gravado. Porm,
existem situaes em que isto no ocorre. Por
exemplo, pode acabar o espao em disco, etc.
perror() (print error): cujo argumento uma string,
indica em que parte do programa o problema ocorreu.
fputs(string, pf);
putc('\n', pf);
if(ferror(pf)) perror("Erro na gravacao");

Exemplo com fputs, ferror e perror


#include <stdlib.h>
#include <string.h>
int main(){
FILE *fp;
char string[100];
if((fp = fopen("arquivo.txt","w")) ==NULL) {
printf("\nNao consigo abrir o arquivo ! ");
exit(1); }
do {
printf("\nDigite uma nova string. Para terminar, digite <enter>: ");
gets(string);
fputs(string, fp); //Escreve a string no arquivo
putc('\n', fp); //Pula uma linha no arquivo
if(ferror(fp)) { //Testa se houve erro
perror("Erro na gravacao"); //imprime o erro
fclose(fp);
exit(1);
}
} while (strlen(string) > 1);
fclose(fp);

Exemplo com fgets


#include <stdio.h>
void main(){
FILE *fp;
char Linha[100];
char *result;
int i;
// Abre um arquivo TEXTO para LEITURA
fp = fopen("arquivo.txt", "r");
if (fp== NULL) { // Se houve erro na abertura
printf("Problemas na abertura do arquivo\n");
return; }
i = 1;
while (!feof(fp)) {
// L uma linha (inclusive com o '\n')
result = fgets(Linha, 100, fp); // o 'fgets' l at 99 caracteres ou at o '\n'
if (result) // Se foi possvel ler
printf("Linha %d : %s",i,Linha);
i++;
}
fclose(fp);

Funes de Manipulao de Arquivos


fread / fwrite

Podemos escrever e ler blocos de dados. Para tanto,


temos as funes fread() e fwrite().
unsigned fread (void *buffer, int no_bytes, int count,
FILE *fp);

O buffer a regio de memria na qual sero


armazenados os dados lidos. O nmero de bytes o
tamanho da unidade a ser lida. count indica quantas
unidades devem ser lidas.

Funes de Manipulao de Arquivos

A funo retorna o nmero de unidades efetivamente


lidas. Este nmero pode ser menor que count quando
o fim do arquivo for encontrado ou ocorrer algum
erro.
Quando o arquivo for aberto para dados binrios,
fread pode ler qualquer tipo de dados.

Funes de Manipulao de Arquivos


fwrite

A funo fwrite() funciona como a sua companheira


fread(), porm escrevendo no arquivo.
unsigned fwrite(void *buffer, int no_bytes, int count,
FILE *fp);

A funo retorna o nmero de itens escritos. Este


valor ser igual a count a menos que ocorra algum
erro.

O exemplo a seguir ilustra o uso de fwrite e fread


para gravar e posteriormente ler uma varivel float
em um arquivo binrio.

#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *pf;
float pi = 3.1415;
float pilido;
if((pf = fopen("arquivo.bin", "wb")) == NULL) /* Abre arq. bin. p/ escrita */
{
printf("Erro na abertura do arquivo");
exit(1);
}
if(fwrite(&pi, sizeof(float), 1,pf) != 1) /* Escreve a varivel pi */
printf("Erro na escrita do arquivo");
fclose(pf); /* Fecha o arquivo */

if((pf = fopen("arquivo.bin", "rb")) == NULL) /* Abre arq. p/ leitura */


{
printf("Erro na abertura do arquivo");
exit(1);
}
if(fread(&pilido, sizeof(float), 1,pf) != 1) /* Le em pilido o valor da varivel
armazenada anteriormente */
printf("Erro na leitura do arquivo");
printf("\nO valor de PI, lido do arquivo, e': %f", pilido);
fclose(pf);
return(0);
}

#include <stdio.h>
int main()
{
FILE *arquivo;
char nome[5]="samu";
int idade=34;
float altura=1.82;
if((arquivo = fopen("samu.dat","wb")) == NULL) {
printf("Erro ao abrir arquivo!!!\n\n");
exit(1); }
fwrite(&nome,sizeof(nome),1,arquivo);
fwrite(&idade,sizeof(idade),1,arquivo);
fwrite(&altura,sizeof(altura),1,arquivo);
fclose(arquivo);
return(0);
}

#include <stdio.h>
int main()
{
FILE *arquivo;
char nome[5];
int idade;
float altura;
if((arquivo = fopen("samu.dat","rb")) == NULL) { /* ERRO */ }
fread(&nome,sizeof(nome),1,arquivo);
fread(&idade,sizeof(idade),1,arquivo);
fread(&altura,sizeof(altura),1,arquivo);
printf("nome : %s\n",nome);
printf("idade : %d\n",idade);
printf("altura: %.2f\n",altura);
fclose(arquivo);
return(0);
}

Funes de Manipulao de Arquivos


fseek

Para se fazer procuras e acessos randmicos em


arquivos usa-se a funo fseek(). Esta move a
posio corrente de leitura ou escrita no arquivo de
um valor especificado, a partir de um ponto
especificado.
int fseek (FILE *fp, long numbytes, int origem);

Funes de Manipulao de Arquivos


O parmetro origem determina a partir de onde os
numbytes de movimentao sero contados. Os
valores possveis so definidos por macros em
stdio.h e so:
Nome
SEEK_SET
SEEK_CUR
SEEK_END

Valor
0
1
2

Significado
Incio do arquivo
Ponto corrente no arquivo
Fim do arquivo

Funes de Manipulao de Arquivos

#include <stdio.h>
int main() {
FILE * f;
f = fopen("myfile.txt", "w");
fputs("Hello World", f);
fseek(f, 6, SEEK_SET);
fputs(" India", f);
fclose(f);
return 0;
} // valor guardado no arquivo: Hello India

Funes de Manipulao de Arquivos


rewind

Retorna a posio corrente do arquivo para o incio.


void rewind (FILE *fp);
remove

Apaga um arquivo especificado.


int remove (char *nome_do_arquivo);

Funes de Manipulao de Arquivos


fprintf

A funo fprintf() funciona como a funo printf().


A diferena que a sada de fprintf() um arquivo e
no a tela do computador.
int fprintf (FILE *fp,char *str,...);
fscanf

A funo fscanf() funciona como a funo scanf(). A


diferena que fscanf() l de um arquivo e no do
teclado do computador.
int fscanf (FILE *fp,char *str,...);

#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *p;
char str[80],c;
printf("\n\n Entre com um nome para o arquivo:\n");
gets(str);
if (!(p = fopen(str,"w"))) { /* ERRO */}
fprintf(p,"Este e um arquivo chamado:\n%s\n", str);
fclose(p);

p = fopen(str,"r");
while (!feof(p))
{
fscanf(p,"%c",&c);
printf("%c",c);
}
fclose(p);
return(0);
}

Funes de Manipulao de Arquivos


rename

Para renomear um arquivo use a funo rename( ).


int rename(NOME_ANTIGO, NOVO_NOME);

onde NOME_ANTIGO e NOVO_NOME so


ponteiros string. Se a funo for bem sucedida ela
retornar zero, caso contrrio, retornar um valor
diferente de zero.

Esta mesma funo serve para mover um arquivo.


Basta incluir a nova localizao como parte do
NOVO_NOME do arquivo.

Funes de Manipulao de Arquivos


#include <stdio.h>
int main(int argc,char *argv[])
{
if(argc != 3)
{
printf("Erro !!! \n");
printf("Sintaxe correta: renomear NOME_ANTIGO NOVO_NOME\n");
exit(1);
}
if(rename(argv[1],argv[2])) printf("Erro ao renomear arquivo!\n");
return(0);
}

Funes de Manipulao de Arquivos


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 especfico
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 incio deste
remove( )
Apagar um arquivo
fflush( )
Descarregar um arquivo

Funes de Manipulao de Arquivos


fflush

Para esvaziar o contedo de uma stream aberta para


sada use a funo fflush( ).
fflush(ARQUIVO);

sendo ARQUIVO um ponteiro de arquivo. Ela


escreve o conteudo do buffer para o arquivo passado
como argumento. Se for passado um valor nulo, todos
os arquivos abertos para sada sero descarregados.
Se tudo ocorrer bem fflush retornar zero, indicando
sucesso. Caso contrrio, devolver EOF.

Você também pode gostar