Beruflich Dokumente
Kultur Dokumente
Binário
(estruturado)
Arquivos em C
- streams - Texto
(caracteres)
1
INF 01202 – Prof. Marcelo Walter – Aula 26
Tipos de arquivos do C
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
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
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).
Binário:
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)
10
INF 01202 – Prof. Marcelo Walter – Aula 26
Modos de abertura para arquivos texto
r+ ok erro 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 )
13
INF 01202 – Prof. Marcelo Walter – Aula 26
Leitura e/ou gravação de arquivos texto:
14
INF 01202 – Prof. Marcelo Walter – Aula 26
Funções de gravação de arquivo texto, por grupo de caracteres
15
INF 01202 – Prof. Marcelo Walter – Aula 26
Funções de gravação de arquivo texto, caractere a caractere
16
INF 01202 – Prof. Marcelo Walter – Aula 26
Funções de leitura de arquivo texto por linha
ch = getc (point_arq )
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 )
rewind(point_arq)
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);
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;
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;
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;
30
INF 01202 – Prof. Marcelo Walter – Aula 26
Geração de um arquivo binário, de floats
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)
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)
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
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
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