Sie sind auf Seite 1von 44

Arquivos

Conjunto de DADOS armazenados em memória secundária


(de forma permanente)

Binário
(estruturado)
Arquivos em C
- streams - Texto
(caracteres)

1
INF 01202 – Prof. Marcelo Walter – Aula 26
Tipos de arquivos do C

ü  Binário: composto por uma sequência (fluxo binário) de


bytes lidos, sem tradução, diretamente do dispositivo
externo. Não ocorre nenhuma tradução e existe uma
correspondência um para um entre os dados do dispositivo
e os que estão no fluxo.

Ø  Texto: composto de uma sequência de bytes


correspondendo a uma sequência de caracteres ASCII,
incluindo letras, dígitos e caracteres especiais utilizados
na escrita e os separadores branco, tab e new line
Ø  A sequência pode ou não ser dividida em linhas
terminadas por um caractere de final de linha.

2
INF 01202 – Prof. Marcelo Walter – Aula 26
Arquivos Binários vs ArquivosTexto
ARQUIVOS BINÁRIOS
•  dados: podem ser estruturados e ou simples (inteiros, float, ...);
•  organizados em blocos de bytes;
•  cada elemento pode corresponder a um ou mais bytes;
•  valores numéricos são representados em forma binária.

ARQUIVOS TEXTO
•  dados: somente caracteres (um caractere = um byte);
•  organizados em sequências de caracteres, formando linhas de tamanho
variável;
•  todos os tipos de valores são armazenados como sequências de
caracteres; no caso de valores reais, o ponto decimal e o sinal, se existir,
também são armazenados como caracteres.

3
INF 01202 – Prof. Marcelo Walter – Aula 26
Arquivos Binários vs ArquivosTexto

COMPARAÇÃO:
Para se armazenar um número real (de 4 bytes), com
10 dígitos:
•  No arquivo texto ocupa:
sizeof(char) * 10 = 10 bytes
tratado como sequência de caracteres ASCII
•  No arquivo binário ocupa:
sizeof(float) = 4 bytes
tratado como valor numérico (binário)

4
INF 01202 – Prof. Marcelo Walter – Aula 26
Arquivo Texto: organização interna

Um arquivo texto compõe-se de uma sequência de


caracteres, formando linhas de tamanho variável.

O elemento corrente de um arquivo texto é o


caractere em que o sistema ficou posicionado após
a última operação sobre o arquivo.

arq.txt
ESTE EH UM TEXTO EXEMPLO EBLABLABLA Õ
Õ
Õ
Õ

FINAL DE
EOF LINHA

5
INF 01202 – Prof. Marcelo Walter – Aula 26
Arquivo Texto: organização interna

As mudanças de linha são geradas pela presença do


caractere ‘\n’.
O final de arquivo é sinalizado por um caractere
indicador de fim de arquivo que, internamente aos
programas, é identificado como EOF.

6
INF 01202 – Prof. Marcelo Walter – Aula 26
Arquivo Texto: marca de fim de linha
As marcas de fim de linha tem que ser colocadas explicitamente pelo
programa.
A marca de fim de arquivo é gerada pelo sistema, quando o arquivo
que foi aberto com opção de escrita é fechado (embora possa ser
inserida pelo programa).

A marca de final de linha em Linguagem C é o caractere ‘\n’, mas


conforme o sistema operacional sua representação pode mudar:

- em Unix, Linux, AIX, Xenix, Mac OS X, BeOS, ...:


LF (line feed)
- em Commodore, Apple II e até Mac OS 9:
CR (carriage return)
= em DOS, OS/2, Microsoft Windows:
CR+LF

Ou seja, cada sistema operacional converte o \n


para o seu marcador específico de fim de linha!
7
INF 01202 – Prof. Marcelo Walter – Aula 26
Arquivos: comparação entre modo texto e binário

Binário:

- O processamento é mais rápido, pois os dados não precisam de


qualquer conversão.
-  Consomem menos espaço em bytes, o que os tornam mais
adequados para grandes volumes da dados.
- Conteúdo não pode ser entendido sem a “máscara” correspondente
(como a structure utilizada), como no caso de texto.

8
INF 01202 – Prof. Marcelo Walter – Aula 26
Arquivos: comparação entre modo texto e binário
Texto:
- Facilidade para a criação de arquivos texto, bastando usar um
editor de textos, como o Bloco de Notas.
-  Facilidade de visualização de conteúdo, pois as informações
estão em caracteres.
-  O processamento é lento porque os dados, ao serem gravados,
devem ser convertidos para a representação de caracteres em
ASCII.
-  Consomem bem mais área para armazenamento
-  Caracteres numéricos precisam ser convertidos antes de
poderem ser quantificados.

9
INF 01202 – Prof. Marcelo Walter – Aula 26
Abertura de arquivo (binário ou texto)

point_arq = fopen (nome do arquivo, modo de abertura)

Semelhante ao arquivo binário, mas sem incluir a letra ‘b’

•  Abre/cria/recria um arquivo com o nome (completo, do arquivo físico)


e modo de abertura desejado passados como parâmetro do tipo
string.
•  A função retorna um apontador para e estrutura FILE.
•  Se não for possível abrir o arquivo, ocorre erro e o valor retornado
em point_arq é NULL.
OBS: após abertura, o programa deve sempre verificar se não houve
erro!

10
INF 01202 – Prof. Marcelo Walter – Aula 26
Modos de abertura para arquivos texto

Modo de Arquivo não Permissão Permissão


Arquivo Existe
abertura existe de leitura de escrita
r ok erro x

w cria novo, antigo eliminado cria x

r+ ok erro x x

w+ cria novo, antigo eliminado cria x x


novos dados acrescentados
a ao final cria x
novos dados acrescentados
a+ ao final cria x x

11
INF 01202 – Prof. Marcelo Walter – Aula 26
Abertura de arquivo texto
Exemplo: Retorna um apontador para uma estrutura FILE.
#include <stdio.h> /* contém definições e funções
p/ uso e manipulação de arquivos */

int main( )
{
FILE *arq;
arq = fopen(“exemplo.txt”,”r”); /*abertura para leitura */
if (arq == NULL) /* retorno NULL indica erro na abertura */
printf(“Erro na abertura do arquivo.”);
.....
} 12

12
INF 01202 – Prof. Marcelo Walter – Aula 26
Funções de manipulação de arquivo texto
(igual aos arquivos binários)
fclose (point_arq )
Fecha um stream de arquivo
Obs.: ao fechar o stream do arquivo, todos os dados
que ainda estavam em buffer são salvos em disco.

fflush (point_arq )

Descarrega o conteúdo em buffer para o arquivo,


sem fechar o stream.

Semelhantes ao arquivo binário

13
INF 01202 – Prof. Marcelo Walter – Aula 26
Leitura e/ou gravação de arquivos texto:

A leitura ou gravação em um arquivo texto pode ser feita:


- linha a linha ou
- caractere a caractere.
Uma linha em um arquivo texto é o conjunto dos caracteres que se
encontram no arquivo entre:
- o início do arquivo e a primeira marca de fim de linha, ou
- o início do arquivo e a marca de fim de arquivo (no caso de
arquivos com uma só linha) ou
- duas marcas de fim de linha.

Na sequência, programas exemplificam as formas de leitura e/ou


gravação sobre arquivos texto.

14
INF 01202 – Prof. Marcelo Walter – Aula 26
Funções de gravação de arquivo texto, por grupo de caracteres

fprintf (point_arq, formatos, lista de variáveis)

Escreve caracteres em um arquivo, baseado


em formatos, de maneira similar ao printf().
Para quebra de linha é necessária a inclusão
de ‘\n’ no formato do comando. Retorna o número de
caracteres escritos (ou número negativo em caso de erro)
fputs (buffer,point_arq)
Escreve o conteúdo da variável buffer no arquivo
apontado por point_arq. Não grava ‘\0’ no arquivo,
apenas ‘\n’, se existir. Retorna valor positivo (inteiro)
em caso de sucesso, ou EOF no caso de erro.

15
INF 01202 – Prof. Marcelo Walter – Aula 26
Funções de gravação de arquivo texto, caractere a caractere

putc (caractere, point_arq)

Escreve um caractere no arquivo. Para indicar


quebra de linha, grave o caractere de quebra de
linha (‘\n’). Para inserir final de arquivo, gravar o
caractere por EOF ou fechar o arquivo.
Retorna o código ASCII (inteiro) do caracter
escrito em caso de sucesso, ou -1 em caso de
erro.

16
INF 01202 – Prof. Marcelo Walter – Aula 26
Funções de leitura de arquivo texto por linha

fscanf (point_arq, formatos, &variaveis)

Lê uma string/linha de um arquivo, baseado em formatos,


semelhante ao scanf. Retorna o número de elementos lidos com
sucesso (valor inteiro), ou -1 se nenhum elemento for lido.

fgets(&buffer_str, num, point_arq)

Lê uma string/linha de um arquivo, até encontrar ‘\n’


ou EOF ou completar num – 1 caracteres.
Obs: a função mantém na leitura o ‘\n’ de fim da linha,
se existir e couber, incluindo na string, e utiliza o último
caractere reservado para o terminador de string.
Retorna um ponteiro pra char (valendo NULL se EOF for
lido antes de qualquer caracter)
17
INF 01202 – Prof. Marcelo Walter – Aula 26
Funções de leitura de arquivo texto, por caractere:

ch = getc (point_arq )

Retorna um caractere, lido do arquivo. Se o final do


arquivo for encontrado ou ocorrer erro, a função
retorna EOF.

18
INF 01202 – Prof. Marcelo Walter – Aula 26
Outras Funções de manipulação de arquivo texto
(igual aos arquivos binários)
feof ( point_arq )

Indica se um arquivo chegou ao fim.


Retorna verdadeiro (não-zero) caso o final tenha sido
atingido, falso (zero) caso contrário.

rewind(point_arq)

Seta a posição corrente do arquivo para o início do arquivo.

Semelhantes ao arquivo binário

19
INF 01202 – Prof. Marcelo Walter – Aula 26
Funções de manipulação de arquivo texto
(igual ao binário)
fseek(point_arq,numbytesdesloc,origem)
Move a posição corrente de leitura/escrita para a posição
calculada como origem + numbytesdesloc
Os valores possíveis, definidos, para origem são:
SEEK_SET ou 0 = Início do arquivo
SEEK_CUR ou 1 = Ponto corrente no arquivo
SEEK_END ou 2 = Fim do arquivo
OBS: fseek retorna zero se foi bem sucedida, mas só posiciona,
não lê nem grava !
...
FILE *arq;
char ch;
arq = fopen(...);
fseek(arq,33, SEEK_SET);
ch = getc(arq); /*lê caractere na posição 34*/
...
...

20
INF 01202 – Prof. Marcelo Walter – Aula 26
Exemplo: Funções de manipulação de arquivo texto
// salva em arquivo texto NUMEL valores inteiros
// Lê do arquivo texto os valores salvos e armazena num vetor
#include <stdio.h>
#define NUMEL 5 Escreve um a um os
valores no arquivo,
int main( ){ com nova linha entre
FILE *arq; cada um
char nome[16]; // para o nome do arquivo em disco
int cont, valor, vetor[NUMEL];
printf("Nome do arquivo: ");
scanf("%s", nome);

if(!(arq = fopen(nome,"w"))) // abre para escrita modo texto


printf("Erro na abertura\n");
else{
printf("Entre %d valores inteiros\n", NUMEL);
for (cont = 0; cont < NUMEL; cont++){
scanf("%d", &valor);
fprintf(arq, "%d\n", valor);
}
fclose(arq);
21
} INF 01202 – Prof. Marcelo Walter – Aula 26
Exemplo: Funções de manipulação de arquivo texto
// abre o mesmo arquivo para leitura

if(!(arq = fopen(nome,"r"))) // abre para leitura


printf("Erro na abertura\n");
else {
for (cont = 0; cont < NUMEL; cont++) // varre o arquivo
{
fscanf(arq, "%d\n", &vetor[cont]);
printf("vetor[%d] = %d\n", cont, vetor[cont]);
}
fclose(arq);
} Arquivo gravado
return 0; 1
} 2
3
4
5

22
INF 01202 – Prof. Marcelo Walter – Aula 26
Escreva um programa para salvar num arquivo txt uma agenda
com nome, prefixo e número de telefone
#include <stdio.h>
#include <string.h>
int main( ){
FILE *arq;
char nome[80];
int prefixo,num,op;

if(!(arq = fopen("Agenda.txt","w"))) // abre para escrita


printf("Erro na abertura\n");
else{
do{
printf("Entre com o nome: "); gets(nome);
printf("Entre com o prefixo: "); scanf("%d",&prefixo);
printf("Entre com o telefone: "); scanf("%d",&num);
fprintf(arq,"%s %d %d\n",nome,prefixo,num);
printf("Deseja continuar? 1-s 2-n");
scanf("%d",&op);
}while(op!=2);
fclose(arq);
}
return 0;
}
23
INF 01202 – Prof. Marcelo Walter – Aula 26
Escreva um programa para salvar num arquivo txt uma agenda
com nome, prefixo e número de telefone

Execução

24
INF 01202 – Prof. Marcelo Walter – Aula 26
Escreva um programa para buscar os dados numa agenda salva
como arquivo txt
#include <stdio.h>
#include <string.h>
int main( ){

FILE *arq;
char nome[80],procurado[80];
int prefixo,num,encontrado=0;

if(!(arq = fopen("Agenda.txt","r"))) // abre para leitura


printf("Erro na abertura\n");
else{
printf("Nome ? ");
scanf("%s",procurado);
while(!feof(arq) && encontrado==0){
fscanf(arq,"%s %d %d\n", nome, &prefixo, &num);
if (!strcmp(nome,procurado)){
printf("%s Prefixo: %d Numero: %d\n\n",nome,prefixo, num);
encontrado=1;
}
}
if (!encontrado) printf("Nome nao existe na agenda!\n");
fclose(arq);
}
return 0;
}
25
INF 01202 – Prof. Marcelo Walter – Aula 26
Escreva um programa para buscar os dados numa agenda salva
como arquivo txt

Execução

26
INF 01202 – Prof. Marcelo Walter – Aula 26
Outros exemplos: getc e putc
#include <stdio.h>

int main( ){
FILE *arq;
char letra,ch;

if(!(arq = fopen("Letras.txt","w+"))) // abre para escrita e leitura


printf("Erro na abertura\n");
else{ // grava caracteres ‘a’ à ‘f’ e insere fim de arquivo
for(letra='a'; letra <= 'f'; letra++)
putc(letra,arq);
putc(EOF,arq); // insere marca de fim de arquivo
rewind(arq);

// lê arquivo texto até marca de fim do arquivo ou erro de leitura


ch = getc(arq);

while (ch != EOF){


printf("%c ", ch); // imprime caractere na tela
ch = getc(arq);
}
fclose(arq);
}
return 0;
27
} INF 01202 – Prof. Marcelo Walter – Aula 26
Comparando fscanf e fgets Arquivo Teste
#include <stdio.h>
#define NUMCHAR 256 Palavra 1
Palavra 2
int main( ){ Esta eh uma longa linha
FILE *arq;
char buffer[NUMCHAR];
if(!(arq = fopen("Teste","r"))) // abre para leitura
printf("Erro na abertura\n");
else{
printf("Imprimindo conteudo do arquivo com fscanf\n");
while(!feof(arq)){
if (fscanf(arq,"%s",buffer) != -1) \\ garante leitura correta
printf("%s-",buffer);
}
rewind(arq);
printf("\n\nImprimindo conteudo do arquivo com fgets\n");
while(!feof(arq)){
if (fgets(buffer,256, arq) != NULL ) \\ garante leitura correta
printf("%s",buffer);
}
fclose(arq);
}
return 0;
}
28
INF 01202 – Prof. Marcelo Walter – Aula 26
Comparando fscanf e fgets Arquivo Teste
#include <stdio.h>
#define NUMCHAR 256 Palavra 1
Palavra 2
int main( ){ Esta eh uma longa linha
FILE *arq;
char buffer[NUMCHAR];
if(!(arq = fopen("Teste","r"))) // abre para escrita
printf("Erro na abertura\n");
else{
printf("Imprimindo conteudo do arquivo com fscanf\n");
while(!feof(arq)){
if (fscanf(arq,"%s",buffer) != -1) \\ garante leitura correta
printf("%s-",buffer);
}
rewind(arq);
printf("\n\nImprimindo conteudo do arquivo com fgetsf\n");
while(!feof(arq)){
if ( fgets(buffer,256, arq) != NULL) \\ garante leitura correta
printf("%s",buffer);
}
fclose(arq);
}
return 0;
}
29
INF 01202 – Prof. Marcelo Walter – Aula 26
Diferenças na gravação de valores numéricos
em arquivos binários e em arquivos texto:

Exemplos de programas com gravação de arquivos:


–  o primeiro gerou um arquivo binário de floats;
–  o segundo gerou um arquivo texto, onde cada linha contém um
valor float, gravado no %6.2f.

Observar os valores retornados por ftell, antes e


depois da escrita, em cada um dos arquivos!

30
INF 01202 – Prof. Marcelo Walter – Aula 26
Geração de um arquivo binário, de floats

Cada valor gravado


ocupa 4 bytes
adicionais. Os valores
são armazenados na
forma binária e, nesta
versão do C, um float
corresponde a 4 bytes.

31
INF 01202 – Prof. Marcelo Walter – Aula 26
Geração de um arquivo texto com valores float, usando
formato %6.2f (6 posições, no mínimo, com 2 casas decimais)

Os valores são armazenados


caractere a caractere.
Dígitos da parte inteira, mais
o ponto e as duas casas
decimais (com arredondamento)
= 9 posições.

Neste caso ainda há o sinal,


logo = 10 posições

32
INF 01202 – Prof. Marcelo Walter – Aula 26
Geração de um arquivo texto com valores float, usando
formato %6.2f (6 posições, no mínimo, com 2 casas decimais)
teste.txt

33
INF 01202 – Prof. Marcelo Walter – Aula 26
Geração de um arquivo texto com valores float, usando
formato %6.2f (6 posições, no mínimo, com 2 casas decimais)

A gravação do arquivo texto com fprintf segue as mesmas regras do printf,


ou seja, ocupa, na gravação, o número de bytes informado como limite
mínimo ou, se o conteúdo ultrapassar o espaço mínimo reservado, utiliza o
que for necessário para evitar a perda das informações. Apenas as casas
decimais obedecem sempre o indicado no formato, mesmo que implique
eliminação de casas ou preenchimento de zeros.
Observe que o número é armazenado na forma de uma sequência de dígitos
(caracteres), sem nenhum valor quantitativo associado. Os caracteres
utilizados são sempre ASCII, incluindo a representação ASCII do(s)
caractere(s) branco(s) incluído(s), do ponto decimal e dos sinais + ou -, se
existirem.

34
INF 01202 – Prof. Marcelo Walter – Aula 26
Exercícios com arquivos texto

1.  C o n s i d e r e u m a r q u i v o t e x t o j á e x i s t e n t e
“texto_input.txt”. Faça um programa que faça uma
cópia desse arquivo texto para outro (copiando todo
texto do primeiro arquivo para o segundo), chamado
“texto_output.txt”

35
INF 01202 – Prof. Marcelo Walter – Aula 26
/*Gera uma copia de um arquivo texto*/
#include <stdio.h>
#define MAXLINHA 255
int main( )
{
FILE *arq1;
FILE *arq2;
int cont = 0;
char linha[MAXLINHA];
if ((arq1 = fopen("texto_input.txt", "r")) == NULL)
printf("Erro ao abrir arquivo entrada \n");
else
if ((arq2 = fopen("texto_output.txt", "w")) == NULL)
printf("Erro ao abrir arquivo saida \n");
else
{
while (!feof(arq1))
if (fgets(linha, sizeof(linha), arq1) != NULL )
{ // leu linha
cont++ ;
fputs (linha, arq2); // grava linha
}
printf("\nLinhas gravadas: %d\n", cont);// informa nro de linhas gravadas
fclose (arq1);
fclose(arq2);
}
.....
} 36
36
INF 01202 – Prof. Marcelo Walter – Aula 26
Exercícios com arquivos texto
2.  Faça um programa, para incluir uma nova linha de
texto (fornecida pelo usuário) no final de um arquivo
texto já existente.
...
#include <stdio.h>
int main( )
{
FILE *arq;
char texto[31];
   if ((arq = fopen(“arquivo.txt”, "a")) == NULL) /*abre para acrescentar*/
      printf("Erro ao abrir arquivo.txt”);
else
{
putc(‘\n’,arq);  /*acrescenta nova linha*/
printf(“Entre o texto a ser inserido (ate 30 caracteres)”);
gets(texto);
fputs(texto, arq);  
    fclose(arq); /*insere sinal de fim de arquivo, se ainda não existir*/
}
}

37
INF 01202 – Prof. Marcelo Walter – Aula 26
Exercícios com arquivos texto

3.  Faça um programa para substituir um determinado


caractere em um arquivo texto existente por outro
(ambos obtidos por leitura via teclado). As
alterações devem ser gravadas no mesmo arquivo!

38
INF 01202 – Prof. Marcelo Walter – Aula 26
#include<stdio.h>
int main( )
{
FILE *arq;
char antigo, novo, temp, caract;
int alt = 0;
if ((arq = fopen("texto_original.txt", "r+")) == NULL)
printf("Erro ao abrir \n");
else
{ printf("\nCaractere a procurar: \n");
scanf(" %c", &antigo);
printf("\nSubstituir por: \n");
scanf(" %c", &novo);
while (!feof(arq))
{ Troca de um caractere
temp = getc(arq); por outro
if(temp == antigo)
{
alt++;
/*volta a posição do caractere procurado*/
fseek(arq,-sizeof(char),SEEK_CUR);
putc(novo,arq); /*substitui*/
fflush(arq); /*grava mudanças no arquivo */
}
}
fclose(arq);
printf("\nNumero de caracteres alterados: %d\n", alt);
}

return 0;
} 39
39
INF 01202 – Prof. Marcelo Walter – Aula 26
Exercícios com arquivos texto

4.  Imprime conteúdo alterado.

40
INF 01202 – Prof. Marcelo Walter – Aula 26
// baseado em alt, informa se alterou!!!
if( alt > 0) // se foram feitas substituições
if ((arq = fopen(”texto_original.txt", "r")) == NULL)
printf("Erro ao abrir para listar \n");
else
{ Escrita na tela o
printf("\n\n"); arquivo texto
while (!feof(arq)) caractere a
printf ("%c", getc(arq)); caractere
fclose(arq);
}
else
printf(“\nNao ocorreram alterações!\n");

return 0;
}

41
INF 01202 – Prof. Marcelo Walter – Aula 26
Tela da execução do programa e arquivo processado:

42
INF 01202 – Prof. Marcelo Walter – Aula 26
Material Suplementar

43
INF 01202 – Prof. Marcelo Walter – Aula 26
Outras Funções de manipulação de arquivo texto
ferror(point_arq)
Indica se a última operação com um arquivo produziu um erro.
Retorna verdadeiro (não-zero) se ocorrer algum erro, caso
contrário, retorna falso (zero).
Cada nova operação com o arquivo modifica a condição de erro.

rename(nomeantigo,novonome)
Renomeia um arquivo ou o move para um diretório destino
Obs.: o arquivo deve estar fechado!

remove(nomedoarquivo)
Apaga o arquivo especificado do disco
Obs.: o arquivo deve estar fechado!

44
INF 01202 – Prof. Marcelo Walter – Aula 26

Das könnte Ihnen auch gefallen