Aula 10
Arquivos
Prof. Gustavo Callou
Características
Podemos armazenar grande quantidade de
informação em arquivos;
Os dados serão gravados em disco.
Tipos de Arquivos
Texto:
Os dados são armazenados em forma de caracteres que
podem ser visualizados ou modificados por um editor de
texto qualquer;
A leitura é feita sequencialmente, do início ao fim.
Binário:
Os dados são armazenados em forma de bits;
O acesso é randômico;
Exemplo: Arquivos executáveis, compactados, etc..
Manipulação de Arquivos
Sequência de Passos:
1. Criar um ponteiro para a estrutura FILE (definida em
stdio.h);
2. Abrir o arquivo;
3. Ler ou gravar dados no arquivo;
4. Fechar o arquivo.
Criar um ponteiro para um arquivo
Tipo de dado para manipulação de arquivos
FILE * arquivo;
Ponteiro que será utilizado na manipulação/acesso do
arquivo;
Abrindo um arquivo
fopen()
Função utilizada para abrir um arquivo;
FILE *fopen(char nomeDoArquivo[], modoAbertura);
Exemplo:
FILE *arquivo;
arquivo = fopen(“arquivo.txt”, “w”);
Modos de AberturaModo Significado
“r” Abre um arquivo texto para leitura. O arquivo deve existir antes de ser
aberto
“w” Cria um arquivo texto para gravação. Se o arquivo não existir ele será
criado. Se já existir, o conteúdo anterior será destruído.
“a” Abre um arquivo texto para gravação. Os dados serão adicionados no
final do arquivo (“append”), se ele já existir. No caso do arquivo não
existir um novo será criado.
“rb” Abre um arquivo binário para leitura. Igual ao modo “r”, só que para
binário.
“wb” Cria um arquivo binário para gravação. Igual ao modo “w”, só que para
binário.
“ab” Abre um arquivo texto para gravação. Igual ao modo “a”, só que para
binário.
“r+” Abre um arquivo texto para leitura e gravação. O arquivo deve existir
e pode ser modificado.
“w+” Cria um arquivo texto para leitura e gravação. Se o arquivo não existir
ele será criado. Se já existir, o conteúdo anterior será destruído.
Modos de Abertura (Cont.)
Modo Significado
“a+” Abre um arquivo texto para gravação e leitura. Os dados serão
adicionados no final do arquivo (“append”), se ele já existir. No caso do
arquivo não existir um novo será criado.
“r+b” Abre um arquivo binário para leitura e escrita. Igual ao modo “r+”, só
que para binário.
“w+b” Cria um arquivo binário para gravação e leitura. Igual ao modo “w+”, só
que para binário.
“a+b” Abre um arquivo texto para gravação e leitura. Igual ao modo “a+”, só
que para binário.
Abrindo um arquivo
Exemplo:1. FILE *arquivo;
2. arquivo = fopen(“arquivo.txt”, “w”);
3. if(!arquivo)
4. printf(“Erro ao abrir o arquivo\n”);
5. else{
6. printf(“Arquivo aberto com sucesso!”);
7. }
A condição !arquivo testa se o arquivo foi aberto com sucesso porque no caso de um erro a função fopen() retorna um ponteiro nulo (NULL).
Algumas funções
fputs( string , arquivo)
Escreve uma string no arquivo
fgets ( string , tamanhoDaString, arquivo)
Lê tamanhoDaString caracteres do arquivo
nomeDoArquivo para a string
fprintf (arquivo, string, <Parâmetros>)
Semelhante ao printf, porém a saída é o arquivo
fscanf (arquivo, string de controle, <variáveis>)
Semelhante ao scanf, porém a entrada vem do arquivo
Algumas funções
fgetc (arquivo)
Lê um caractere do stream arquivo e o retorna
fputc( caractere , arquivo)
Escreve o caractere no arquivo
feof (arquivo)
Retorna 1 se estiver no fim do arquivo
fflush (arquivo)
Limpa o buffer para os arquivos
Manipulação de Arquivos
Uma vez aberto o arquivo, podemos ler ou escrever
nele utilizando algumas funções.
Manipulação de Arquivos
fclose() – Fecha um arquivo
Um arquivo deverá ser fechado após seu uso;
int fclose (FILE *fp);
Manipulação de Arquivos
putc() – Escreve um caractere no arquivo
int putc (int ch, FILE *fp);
OBS.: fputc() é equivalente a putc()
Usando putc para escrever
no arquivo
#include <stdio.h>
int main()
{
FILE *arquivo;
char nome[30];
int i;
arquivo = fopen("arquivo.txt","w");
if(!arquivo)
{
printf( "Erro na abertura do arquivo");
exit(0);
}
printf("Entre com o nome a ser gravada no arquivo:");
gets(nome);
for(i=0; nome[i]; i++)
putc(nome[i], arquivo);
fclose(arquivo);
return 0;
}
Usando fputs para escrever
no arquivo
#include <stdio.h>
int main()
{
FILE *arquivo;
char nome[30];
int i;
arquivo = fopen("arquivo.txt","w");
if(!arquivo)
{
printf( "Erro na abertura do arquivo");
exit(0);
}
printf("Entre com o nome a ser gravada no arquivo:");
gets(nome);
fputs(nome, pf);
fclose(arquivo);
return 0;
}
Usando fgets para ler
do arquivo
#include <stdio.h>
int main()
{
FILE *arquivo;
char nome[30];
int i;
arquivo = fopen("arquivo.txt",“r");
if(!arquivo)
{
printf( "Erro na abertura do arquivo");
exit(0);
}
fgets(nome, 30, pf);
fclose(arquivo);
return 0;
}
Manipulação de Arquivos
getc() - retorna um caractere lido do arquivo;
int getc (FILE *fp);
OBS.: Equivalente à fgetc().
Manipulação de Arquivos
feof() - retorna não-zero se o arquivo chegou ao
EOF ("End Of File"), caso contrário retorna zero.
int feof (FILE *fp);
Manipulação de Arquivos
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *fp;
int c;
fp = fopen("arquivo.txt","r");
if(!fp)
{
printf( "Erro na abertura do arquivo");
exit(0);
}
while((c = getc(fp) ) != EOF)
printf("%c", (char)c);
fclose(fp);
return 0;
}
Manipulação de Arquivos
fgets() - Para se ler uma string num arquivo.
char *fgets (char *str, int tamanho,FILE *fp);
A função lê a string até que um caracter de nova linha
seja lido ou (tamanho – 1) caracteres tenham sido lidos.
Se o caracter de nova linha ('\n') for lido, ele fará parte da
string, o que não acontecia com gets.
A string resultante sempre terminará com '\0‘ (por isto
somente (tamanho-1) caracteres, no máximo, serão
lidos).
Manipulação de Arquivos
fputs() - escreve uma string num arquivo.
char *fputs (char *str, FILE *fp);
Manipulação de Arquivos
ferror() - determina se uma operação com arquivo
produziu um erro. Retorna zero caso não tenha
ocorrido erro.
int ferror (FILE *fp);
Manipulação de Arquivos
#include <stdio.h>
int main()
{
FILE *pf;
char string[100];
if(!(pf = fopen("arquivo.txt","wb")))
exit(1);
do
{
printf("\nDigite uma nova string. Para terminar,
digite <enter>: ");
fgets(string,100,stdin);
fputs(string, pf);
if(ferror(pf))
exit(1);
} while (strlen(string) > 1);
fclose(pf);
return 0;
}
Manipulação de Arquivos
fscanf() - funciona como a função scanf()
int fscanf (FILE *fp,char *str,...);
a única diferença do protótipo de fscanf() para o de
scanf() é a especificação do arquivo origem através
do ponteiro de arquivo.
Manipulação de Arquivos
fprintf() - funciona como a função printf()
int fprintf (FILE *fp,char *str,...);
a única diferença do protótipo de fprintf() para o de
printf() é a especificação do arquivo destino através
do ponteiro de arquivo.
Manipulação de Arquivos
Podemos escrever e ler blocos de dados em um
determinado arquivo:
fread()
fwrite()
Utilizando em arquivos binários
Manipulação de Arquivos
fread() - ler blocos de dados
unsigned int fread (void *buffer, int
numero_de_bytes, int count, FILE *fp);
A função retorna o número de unidades efetivamente
lidas. Este número pode ser menor que count quando o
fim do arquivo for encontrado ou ocorrer algum erro.
Manipulação de Arquivos
fwrite() - Escreve blocos de dados;
unsigned int fwrite(void *buffer, int
numero_de_bytes, int count, FILE *fp);
A função retorna o número de itens escritos. Este valor
será igual a count, a menos que ocorra algum erro.
Manipulação de Arquivos
#include <stdio.h>
int main() {
FILE *pf;
float pi = 3.1415, pilido;
if(!(pf = fopen("arquivo.bin", "wb"))) exit(1);
if(fwrite(&pi, sizeof(float), 1,pf) != 1) {
printf("Erro na escrita do arquivo!");
exit(2); }
fclose(pf);
if(!(pf = fopen("arquivo.bin", "rb"))) exit(1);
if(fread(&pilido, sizeof(float), 1,pf) != 1) {
printf("Erro na leitura do arquivo!");
exit(3); }
printf("\nO valor de PI, lido do arquivo e': %.4f", pilido);
fclose(pf); return(0);
}
Manipulação de Arquivos
fseek() – Alterando a posição do arquivo, posiciona
um arquivo em um byte específico
int fseek(arquivo, numeroDeBytes, origem);
"Salta“ o correspondente número de bytes (pode ser
utilizado sizeof()) passados a partir de origem, sendo
origem uma das 3 opções:
SEEK_SET início do arquivo
SEEK_CUR posição atual
SEEK_END fim do arquivo
Manipulação de Arquivos
#include <stdio.h>
int main ()
{
FILE * pFile;
pFile = fopen ( "example.bin" , "wb" );
fputs ( "This is an apple." , pFile );
fseek ( pFile , 9 , SEEK_SET );
fputs ( " sam" , pFile );
fclose ( pFile );
return 0;
}Saída:
Qual vai ser a saída????
Manipulação de Arquivos
#include <stdio.h>
int main ()
{
FILE * pFile;
pFile = fopen ( "example.bin" , "wb" );
fputs ( "This is an apple." , pFile );
fseek ( pFile , 9 , SEEK_SET );
fputs ( " sam" , pFile );
fclose ( pFile );
return 0;
}Saída:
This is a sample
Manipulação de Arquivos
rewind () - Volta ponteiro ao inicio do arquivo
Int rewind ( arquivo ) ;
Exercício
1 - Fazer um programa que salva a estrutura de
“Cliente” (da Aula 09 - Estrutura) em um arquivo.
2 - Fazer um programa que ler de um arquivo os
dados salvos da estrutura Cliente e os recupera
para serem trabalhados. Imprimir na tela a partir da
estrutura os dados lidos.
Gustavo Callou DEINFO/UFRPE 35
Perguntas?