Linguagem C
Arquivos – Uso de Memória Secundária
Prof. Marcelo R. Zorzan Prof. Moacir P. Ponti Jr.
Agenda
Uso da memória secundária
Modos de acesso
Modos de abertura de arquivo
Ponteiro de Arquivo
Escrita e leitura por caractere
Escrita e leitura por blocos
Uso da Memória Secundária
Em muitos casos necessitamos da memória secundária
(auxiliar), para armazenar informações
Utilizando discos (HD, disquetes, etc.), podemos utilizar
arquivos para armazenar os dados necessários
Um arquivo é uma coleção de bytes referenciados por
E/S ANSI vs E/S Unix vs E/S C++
C ANSI – define conjunto completo de funções de E/Spara ler e escrever qualquer tipo de dado
C Unix (antigo) – contem dois sistemas distintos de
rotinas para E/S
C++ suporta todo o sistema de arquivos definido pelo C
ANSI.
• no entanto, C++ também define seu próprio sistema de E/S orientado a objetos
Streams e Arquivos
C fornece interface independente do dispositivo real que
é acessado.
• Provê um nível de abstração entre o programador e o dispositivo utilizado
• Esta abstração é chamada de stream • O dispositivo real é chamado de arquivo
Streams e Arquivos
STREAMS DE TEXTO
• Sequência de caracteres
• Organizada ou não em linhas terminadas por um caractere de nova linha ('\n'), LF, ASCII 10
• É feita conversão e controlado fim de arquivo
STREAMS BINÁRIAS
• Sequência de bytes
• Correspondência de um para um com aqueles encontrados no dispositivo externo
Streams e Arquivos
ARQUIVOS
• Qualquer coisa, desde um arquivo em disco , um terminal ou uma impressora
• Uma stream é associada com um arquivo específico realizando uma operação de abertura • Uma vez que o arquivo está aberto, informações podem ser trocadas entre ele e o programa
• Nem todos os arquivos apresentam os mesmos
recursos: acesso a disco pode ser aleatório, um teclado não.
Modos de acesso
Quatro diferentes modos de acesso são possíveis, sendo
os dados lidos e escritos:
um caractere por vez como Strings
como Strings formatadas
em registro ou bloco – grupo de dados de tamanho
fixo usado para armazenar itens similares em sequência (como arrays)
Ponteiro de Arquivo
Um ponteiro de arquivo é um ponteiro para informações
que definem várias características de um arquivo:
seu nome, status e posição atual no arquivo.
Para acessar um arquivo é preciso obter uma variável
ponteiro de arquivo, usando o comando:
Abrindo um arquivo
A declaração do ponteiro de arquivo permite relacionar a
esta variável a abertura de um determinado arquivo.
Para isto é preciso definir: O nome do arquivo
O tipo de abertura
Onde guardar informações sobre o arquivo
FILE *fp;
fp = fopen("arquivo.txt", "w");
[nome] [tipo] [onde guardar]
fopen( )
A função “fopen” tem duas finalidades:
- abrir uma fila de bytes
- ligar um arquivo em disco àquela fila
FILE *fopen(char *NomeArq, char *modo); FILE *arquivo;
arquivo = fopen("teste", "w")); if ( ( arquivo == NULL ) {
printf("Não posso abrir o Arquivo teste.\n");
exit(1); // força o término da execução da rotina
Modo
Significado
“r” Abre Arquivo de Texto para Leitura “w” Cria Arquivo de Texto para Gravação “a” Anexa a um Arquivo de Texto
“rb” Abre Arquivo Binário para Leitura “wb” Cria Arquivo Binário para Gravação “ab” Anexa a um Arquivo Binário
“r+” Abre Arquivo de Texto para Leitura/Gravação “w+” Cria Arquivo de Texto para Leitura/Gravação
“a+” Abre ou Cria Arquivo de Texto para Leitura/Gravação “r+b” Abre Arquivo Binário para Leitura/Gravação
“w+b” Cria Arquivo Binário para Leitura/Gravação “a+b” Abre ou Cria Arquivo Binário para
Fechando um arquivo - fclose ( )
Fecha as filas abertas.
Caso o programa seja encerrado sem que as filas
sejam fechadas, dados gravados na memória
podem ser perdidos.
int fclose(FILE *fp);
Exemplo:
FILE *arquivo;
arquivo = fopen("teste", "w");
fputc ( )
Grava um caracter em fila previamente aberta
int fputc(int ch, FILE *fp);
ch é o caracter a ser gravado
fp é o ponteiro devolvido por fopen
Exemplo:
FILE *arquivo;
arquivo = fopen("teste.txt", "w"));
fgetc ( )
Lê um caracter em fila previamente aberta
int fgetc(FILE *fp);
fp é o ponteiro devolvido por fopen
Exemplo: FILE *arquivo; arquivo = fopen("teste.txt", "r")); ch = fgetc(arquivo); while (ch != EOF){ ch = fgetc(arquivo); }
rewind( )
Reinicia o arquivo, ou seja, movimenta o
ponteiro do arquivo para seu início.
Exemplo:
FILE *arquivo;
arquivo = fopen("teste", "w")); while (ch != EOF)
ch = getc(arquivo); rewind(arquivo);
Esvaziando stream - fflush( )
Esvazia o conteúdo de uma stream de saída,
escrevendo os dados no arquivo.
int fflush(FILE *fp);
- devolve 0 para sucesso ou EOF insucesso
Exemplo:
FILE *arquivo;
arquivo = fopen("teste.txt", "r+"); putc('a', arquivo);
putc('1', arquivo);
if (fflush(arquivo) == 0)
int main(void){
FILE *arq; // declara ponteiro de arquivo
char ch;
if ((arq=fopen("arqtest.txt","w+")) == NULL) { exit(1);
} // tenta criar arquivo
ch = getchar(); // usuario digita caracter
while (ch != '0') {
fputc(ch, arq); // grava ch no arquivo
ch = getchar(); // usuario digita caracter
}
fflush(arq); // esvazia stream
rewind(arq); // volta ponteiro para inicio do arquivo
while ((ch = fgetc(arq))!=EOF) {
printf("%c", ch); // imprime caracter lido
}
fclose(arq); // fecha arquivo
}
fwrite( ) e fread( )
Permitem o uso de blocos de daos
leitura – fread()
escrita – fwrite()
int fread(void *mem, int n_bytes, int cont, FILE *fp);
fwrite( )
Exemplo fwrite():
FILE *arquivo; arquivo = fopen("teste.dat","wb+"); int valor = 900; int idade = 20; float salario = 1500.99;fwrite(&valor, sizeof(int), 1, arquivo);
fwrite(&salario, sizeof(float), 1, arquivo); fwrite(&idade, sizeof(int), 1, arquivo);
fread( )
Exemplo fread():
FILE *arq; arq = fopen("teste.dat","rb"); int valor_2; int idade_2; float salario_2;fread(&valor_2, sizeof(int), 1, arq);
fread(&salario_2, sizeof(float), 1, arq); fread(&idade_2, sizeof(int), 1, arq);
Exemplo - fwrite ( )
int main(void) { FILE *fp;
float f = 12.23; int a = 1099;
if ((fp=fopen("teste","wb+")) == NULL) {
printf("Arquivo não pode ser criado\n"); exit(1);
}
fwrite(&f, sizeof(float), 1, fp);
fwrite(&a, sizeof(int), 1, fp);
fclose(fp); }
Exemplo - fread ( )
int main(void) { FILE *fp;
float x; int j;
if ((fp=fopen("teste","r+b")) == NULL) {
printf("Arquivo não pode ser aberto\n"); exit(1);
}
fread(&x, sizeof(float), 1, fp);
fread(&j, sizeof(int), 1, fp);
printf("%.3f %d", x, j); fclose(fp);
Exemplo – registro (parte 1)
#include <stdio.h> #include <stdlib.h> #define MAX 100
typedef struct cli { char nome[30];
int idade; } CLIENTE;
int main(void) {
FILE *fp;
CLIENTE pc_escrita[MAX], pc_leitura[MAX];; int i;
Exemplo – registro (parte 2)
fp=fopen("teste.dat","w+b"); // tenta abrir/criar
for (i=0; i<MAX; i++) {
// Pede ao usuário que digite informacoes
printf("(%d) Nome: ", i+1); __fpurge(stdin);
fgets(pc_escrita[i].nome, 30, stdin); printf("Idade: ");
__fpurge(stdin);
scanf("%d", &pc_escrita[i].idade );
// Escreve registro no arquivo
printf("Escrevendo no arquivo...\n");
fwrite(&pc_escrita[i], sizeof(CLIENTE), 1, fp);
}
Exemplo – registro (parte 3)
fflush(fp); // esvaziando stream
rewind(fp); // rebobinando arquivo para leitura for (i=0; i<MAX; i++) {
// Le registro do arquivo
fread(&pc_leitura[i], sizeof(CLIENTE), 1, fp);
// Escreve na tela registro lido printf("(%d)\n", i+1); printf("Nome: %s", pc_leitura[i].nome); printf("Idade: %d", pc_leitura[i].idade); } fclose(fp); }