aula 10 arquivos - cin.ufpe.brgrac/ip/aula11 - arquivos.pdf · exemplo: file *arquivo; arquivo =...

Post on 23-Jul-2020

2 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Aula 10

Arquivos

Prof. Gustavo Callou

gustavo.callou@ufrpe.br

gcallou@gmail.com

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?

top related