Вы находитесь на странице: 1из 36

Manipulação de

Arquivos em C
Introdução

• A linguagem C não contém nenhum comando de


E/S. Ao contrário, todas as operações de E/S
ocorrem mediante chamadas de biblioteca C padrão;

• Essa abordagem faz o sistema de arquivos de C


extremamente poderoso e flexível;

• O sistema de E/S de C é único, porque dados


podem ser transferidos na sua representação binária
interna ou em um formato de texto legível por
humanos;
Streams e Arquivos
• Antes de começar a falar do sistema de arquivos C
ANSI, é importante entender a diferença entre os
termos streams e arquivos;
• O sistema de arquivos de C é projetado para
trabalhar com uma ampla variedade de dispositivos,
incluindo terminais, acionadores de disco e
acionadores de fita;
• Embora cada um dos dispositivos seja muito
diferente, o sistema de arquivo com buffer
transforma-os em um dispositivo lógico chamado de
stream;
Streams e Arquivos

• Portanto, o stream é uma abstração do dispositivo


real chamado de arquivo;

• Pelo fato de as streams serem amplamente


independentes do dispositivo, a mesma função pode
escrever em um arquivo em disco ou em algum
outro dispositivo, como o console;

• Existem dois tipos de streams:


 Texto;
 Binária;
Streams e Arquivos
• Uma stream de texto é uma sequência de
caracteres.
 O padrão C ANSI permite (mas não exige) que
uma stream de texto seja organizada em linhas
terminadas por um caractere de nova linha;
 Porém, o caracter de nova linha é opcional na
última linha e é determinado pela implementação;

• Uma stream binária é uma sequência de bytes com


uma correspondência de um para com aqueles
encontrados no dispositivo externo – isto é, não
ocorre nenhuma tradução de caracteres.
O ponteiro de arquivo
• Um ponteiro de arquivo é um ponteiro para uma
área na memória(buffer) onde estão contidos vários
dados sobre o arquivo a ler ou escrever, tais como o
nome do arquivo, estado e posição corrente.
•O buffer apontado pelo ponteiro de arquivo é a área
intermediária entre o arquivo no disco e o programa.
• Este buffer intermediário entre arquivo e programa
é chamado 'fluxo', e um fluxo é uma entidade lógica
genérica, que pode estar associada a uma unidade
de fita magnética, um disco, uma porta serial, etc.
O ponteiro de arquivo

• Um ponteiro de arquivo é uma variável-ponteiro do


tipo FILE que é definida em stdio.h.
• Para ler ou escrever em um arquivo de disco, o
programa deve declarar uma variável ponteiro de
arquivo, similar as demais variáveis do programa:

FILE *fp;

onde fp é o nome que escolhemos para a variável


(poderia ser qualquer outro).
O ponteiro de arquivo

Disco Memória

Buffer
Fluxo
Stream

FILE *fp; fp
char a; a Dados
fp=fopen(“nome”,”modo”);

Programa
As funções mais comuns do Sistema
de Arquivo
Função Operação
fopen() Abre um fluxo
fclose() Fecha um fluxo
putc() Escreve um caractere para um fluxo
getc() Lê um caractere para um fluxo
fseek() Procura por um byte especificado no fluxo
fprintf() É para um fluxo aquilo que printf() é para o console
fscanf() É para um fluxo aquilo que scanf() é para o console
feof() Retorna verdadeiro se o fim do arquivo é encontrado
ferror() Retorna verdadeiro se ocorreu um erro
fread() Lê um bloco de dados de um fluxo
fwrite() Escreve um bloco de dados para um fluxo
rewind() Reposiciona o começo do arquivo
remove() Apaga um arquivo
Abrindo um arquivo
• Para abrir um arquivo, devemos utilizar a função
fopen() que é definida em stdio.h.

int fopen(“nome”,”modo”);

onde o “nome” deve ser uma string de


caracteres que compreende um nome de arquivo
válido para o sistema operacional e onde possa ser
incluída uma especificação de caminho (PATH) e o
“modo” é uma string contendo o estado desejado
para abertura, conforme tabela a seguir:
Abrindo um arquivo
Modo Significado
"r" Abre um arquivo para leitura
"w" Cria um arquivo para escrita
"a" Acrescenta dados para um arquivo existente
"rb" Abre um arquivo binário para leitura
"wb" Cria um arquivo binário para escrita
"ab" Acrescenta dados a um arquivo binário existente
"r+" Abre um arquivo para leitura/escrita
"w+" Cria um arquivo para leitura/escrita
"a+" Acrescenta dados ou cria um arquivo para leitura/escrita
"r+b" Abre um arquivo binário para leitura/escrita
"w+b" Cria um arquivo binário para leitura/escrita
"a+b" Acrescenta ou cria um arquivo binário para leitura/escrita
"rt" Abre um arquivo texto para leitura
"wt" Cria um arquivo texto para escrita
"at" Acrescenta dados a um arquivo texto
"r+t" Abre um arquivo-texto para leitura/escrita
"w+t" Cria um arquivo texto para leitura/escrita
"a+t" Acrescenta dados ou cria um arquivo texto para leitura/escrita
Abrindo um arquivo para escrita

Disco Memória

Buffer
Fluxo
Stream

FILE *fp; fp
char a; a Dados
fp=fopen(“teste”,”wt”);

Programa
Abrindo um arquivo para leitura

Disco Memória

Buffer
Fluxo
Stream

FILE *fp; fp
char a; a Dados
fp=fopen(“teste”,”rt”);

Programa
Fechando um arquivo

Para fechar um arquivo, devemos utilizar a função


fclose() que é definida em stdio.h.

int fclose(FILE *fp);

onde fp é o ponteiro do arquivo retornado


pela chamada à função fopen(). Um valor de
retorno igual a zero significa uma operação de
fechamento com sucesso; qualquer outro valor
indica um erro.
Fechando um arquivo

Disco Memória

Buffer
Fluxo
Stream

FILE *fp; fp
char a; a Dados
fp=fopen(“nome”,”modo”);

Programa
fclose(fp);
Escrevendo um caracter

A função putc() é usada para escrever caracteres


para um fluxo que foi previamente aberto para
escrita pela função fopen(). A função está descrita
em stdio.h e é declarada como:

int putc(int ch, FILE *fp);

onde fp é o ponteiro de arquivo retornado


pela função fopen() e,
ch é o caractere a ser escrito.
Lendo um caracter
A função getc() é usada para ler caracteres do
fluxo aberto em modo de leitura pela função fopen().
A função é declarada como:

int getc(FILE *fp)

onde fp é um ponteiro de arquivo do tipo


FILE retornado pela função fopen().

A função getc() retornará uma marca EOF quando


o fim do arquivo tiver sido encontrado ou um erro
tiver ocorrido.
Exemplo de r/w - caracter
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
int main(void) int main(void)
{ {
FILE *fp; FILE *fp;
char ch; char ch;
fp=fopen("teste.txt","wt"); fp=fopen("teste.txt","rt");
do ch= getc(fp);
{ while(!feof(fp))
ch=getchar(); {
putc(ch, fp); putchar(ch);
} while (ch!='$'); ch=getc(fp);
fclose(fp); }
} getch(); fclose(fp);
}
Escrevendo uma string

A função fputs() é usada para escrever uma string


para um fluxo que foi previamente aberto para
escrita pela função fopen(). A função está descrita
em stdio.h e é declarada como:

int fputs(char *string, FILE *fp);

onde fp é o ponteiro de arquivo retornado


pela função fopen() e,
char *string é a string a ser escrita.
Lendo uma string
A função fgets() é usada para ler string do fluxo
aberto em modo de leitura pela função fopen(). A
função é declarada como:

char *fgets(char string, int limite, FILE *fp)

onde fp é um ponteiro de arquivo do tipo FILE


retornado pela função fopen();
char string é a variável que recebe o conteúdo;
int limite é número máximo de caracteres a serem
lidos.
A função fgets() retornará uma marca NULL quando
o fim do arquivo for encontrado ou um erro ocorrer.
Exemplo de r/w - string
int main(void) int main(void)
{ {
FILE *fp; FILE *fp;
char ch[80]; char ch[80];
fp=fopen("teste.txt","wt"); fp=fopen("teste.txt","rt");
do{ fgets(ch,80,fp);
gets(ch); while(!feof(fp)){
fputs(ch,fp); puts(ch);
putc('\n',fp); fgets(ch,80,fp);
}while(ch[0]!='\0'); }
fclose(fp); fclose(fp);
puts("Pressione qualquer tecla puts("Pressione qualquer tecla
para continuar"); para continuar");
getch(); getch();
} }
Escrevendo um inteiro

A função putw() é usada para escrever um inteiro


para um fluxo que foi previamente aberto para
escrita pela função fopen(). A função está descrita
em stdio.h e é declarada como:

int putw(int x, FILE *fp);

onde fp é o ponteiro de arquivo retornado


pela função fopen() e,
x é o inteiro a ser escrito.
Lendo um inteiro
A função getw() é usada para ler inteiros do fluxo
aberto em modo de leitura pela função fopen(). A
função é declarada como:

int getw(FILE *fp)

onde fp é um ponteiro de arquivo do tipo


FILE retornado pela função fopen().

A função getw() retornará uma marca EOF quando


o fim do arquivo tiver sido encontrado ou um erro
tiver ocorrido.
Exemplo de r/w - inteiro
int main(void) int main(void)
{ {
FILE *fp; FILE *fp;
int x; int x;
fp=fopen("teste.txt","wt"); fp=fopen("teste.txt","rt");
scanf("%d",&x); x=getw(fp);
while(x!=-1) while(!feof(fp)){
{ printf("%d\n",x);
putw(x,fp); x=getw(fp);
scanf("%d",&x); }
} fclose(fp);
fclose(fp); puts("Pressione qualquer tecla
puts("Pressione qualquer tecla para continuar");
para continuar"); getch();
getch(); }
}
Escrevendo formatado
A função fprintf() é usada para escrever dados
formatados para um fluxo que foi previamente aberto
para escrita pela função fopen(). A função está
descrita em stdio.h e é declarada como:

int fprintf(FILE *fp, char


*string_de_controle, lista_de_argumentos);

onde fp é o ponteiro de arquivo retornado


pela função fopen(), string_de_controle são os
formatos, controles e/ou texto e
lista_de_argumerntos são as variáveis.
Lendo formatado
A função fscanf() é usada para ler dados
formatados do fluxo aberto em modo de leitura pela
função fopen(). A função é está descrita em stdio.h
e declarada como:

int fscanf(FILE *fp, char


*string_de_controle, lista_de_argumentos);

onde fp é o ponteiro de arquivo retornado


pela função fopen(), string_de_controle são os
formatose lista_de_argumerntos são as variáveis.
Exemplo de r/w - formatado
int main(void) int main(void)
{ {
FILE *fp; FILE *fp;
char ch[80]; char ch[80];
fp=fopen("teste.txt","wt"); fp=fopen("teste.txt","rt");
gets(ch); fscanf(fp,"%s",ch);
while(ch[0]!='\0') while(!feof(fp))
{ {
fprintf(fp,"string=%s\n",ch); puts(ch);
gets(ch); fscanf(fp,"%s",ch);
} }
fclose(fp); fclose(fp);
puts("Pressione qualquer tecla puts("Pressione qualquer tecla
para continuar"); para continuar");
getch(); getch();
} }
Escrevendo em matriz
A função fwrite() é usada para escrever um bloco de dados
num fluxo que foi previamente aberto para escrita pela função
fopen(). A função está descrita em stdio.h e é declarada
como:

unsigned fwrite(void *buffer, int num_bytes,


int count, FILE *fp);
buffer, usualmente aponta para uma matriz ou
estrutura, número de bytes a ser escrito é especificado por
num_bytes, o argumento count determina quantos itens
(cada um tendo num_bytes de tamanho) serão escritos e fp é
um ponteiro para um arquivo de um fluxo previamente aberto
por fopen().
Lendo de matriz
A função fread() é usada para ler um bloco de dados para
um fluxo que foi previamente aberto para escrita pela função
fopen(). A função está descrita em stdio.h e é declarada
como:

unsigned fread(void *buffer, int


num_bytes, int count, FILE *fp);
buffer, usualmente aponta para uma matriz ou
estrutura, número de bytes a ser lido é especificado por
num_bytes, o argumento count determina quantos itens
(cada um tendo num_bytes de tamanho) serão lidos e fp é
um ponteiro para um arquivo de um fluxo previamente aberto
por fopen().
Exemplo de w - matriz
int main(void)
{
FILE *fp;
float exemplo[10][10];
int i,j;
fp=fopen("teste.dat","wb");
for(i=0; i<10; i++)
{
for(j=0; j<10; j++)
{
exemplo[i][j] = (float) i+j;
}
}
fwrite(exemplo, sizeof(exemplo), 1, fp);
fclose(fp);
getch();
}
Exemplo de r - matriz
int main(void)
{
FILE *fp;
float exemplo[10][10];
int i,j;
fp=fopen("teste.dat","rb");
fread(exemplo,sizeof(exemplo), 1, fp);
for(i=0; i<10; i++)
{
for(j=0; j<10; j++)
printf("%5.1f ", exemplo[i][j]);
printf("\n\n");
}
fclose(fp);
getch();
}
Criando o nome do arquivo
int main(void)
{
clrscr();
FILE *al;
char nome[15];
puts("Digite o nome do arquivo para salvar a string. ");
gets(nome);
strcat(nome,".txt");
al=fopen(nome,"wt");
puts("\nPressione qualquer tecla para continuar ...");
getch();
fclose(al);
}
Exercícios
OBS: para todos os exercícios, o nome do
arquivo deve ser definido pelo usuário no
início da execução do programa.
1. Escrever um programa que lê uma string
e a escreve em ordem inversa num
arquivo.
2. Escrever um programa que lê uma string
s[30] e escreve cada palavra desta string
numa nova linha dentro de um arquivo.
Exercícios
3. Escrever um programa que lê o nome do arquivo
e escreve na tela o seu conteúdo.
4. Escrever um programa que lê uma string e a
escreve em maiúsculo num arquivo.
Exercícios
5. Elaborar um programa em C que lê uma string de no máximo
80 caracteres e a escreve num arquivo de nome “string.tx_” da
seguinte forma:
a) Toda a string;
b) Uma linha em branco;
c) A string invertida;
d) Uma linha em branco;
e) Cada palavra da string numa linha;
f) Uma linha em branco;
g) Cada letra da string numa linha;
h) Uma linha em branco;
i) Cada caracter da string e quantas vezes ele esta
presente na string;
Posteriormente, abrir o arquivo “string.tx_” e escrever o seu
conteúdo.
Exercícios
6. Elaborar um programa em C que lê uma string de no máximo
40 caracteres e a escreve num arquivo, com o nome definido
pelo usuário, da seguinte forma:
a) Toda a string numa linha;
b) Uma linha em branco;
c) Dois caracteres por linha, separados por uma
tabulação. O primeiro caracter corresponde ao
minúsculo e o segundo ao maiúsculo da primeira
ocorrência da string. Na próxima linha do arquivo, a
segunda ocorrência da string.
Exemplo: “uma”
uma
u U
m M
a A