26
Devemos iniciar nossa explanação pelo conceito de arquivo: Arquivo é uma unidade lógica utilizada para armazenar dados em disco ou em qualquer outro dispositivo externo de armazenamento. Pode-se abrir, fechar, ler, escrever ou apagar um arquivo. Manipulação de Arquivos 512 abrir, fechar, ler, escrever ou apagar um arquivo. A linguagem C manipula tanto arquivos quanto dispositivos de I/O, se utilizando do conceito de “ponteiro para arquivo”. Sendo disponibilizada uma série de funções para trabalhar com este conceito, cujos protótipos estão reunidos em stdio.h.

Manipulação de Arquivosmarcelo.linder/arquivos_iapCA/material_semes… · -fopen() Esta é a função de abertura de arquivos. Seu protótipo é: FILE *fopen (char *nome_do_arquivo,char

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Manipulação de Arquivosmarcelo.linder/arquivos_iapCA/material_semes… · -fopen() Esta é a função de abertura de arquivos. Seu protótipo é: FILE *fopen (char *nome_do_arquivo,char

Devemos iniciar nossa explanação peloconceito de arquivo:

Arquivo é uma unidade lógica utilizada paraarmazenar dados em disco ou em qualquer outrodispositivo externo de armazenamento. Pode-seabrir, fechar, ler, escrever ou apagar um arquivo.

Manipulação de Arquivos

512

abrir, fechar, ler, escrever ou apagar um arquivo.

A linguagem C manipula tanto arquivos quantodispositivos de I/O, se utilizando do conceito de“ponteiro para arquivo”. Sendo disponibilizadauma série de funções para trabalhar com esteconceito, cujos protótipos estão reunidos emstdio.h.

Page 2: Manipulação de Arquivosmarcelo.linder/arquivos_iapCA/material_semes… · -fopen() Esta é a função de abertura de arquivos. Seu protótipo é: FILE *fopen (char *nome_do_arquivo,char

A definição do “ponteiro para arquivo” tambémestá no arquivo stdio.h.

Podemos declarar um ponteiro para arquivo daseguinte maneira:

FILE *p;

Manipulação de Arquivos

513

FILE *p;

Os arquivos podem ser classificados em:

- binários;

- texto.

Page 3: Manipulação de Arquivosmarcelo.linder/arquivos_iapCA/material_semes… · -fopen() Esta é a função de abertura de arquivos. Seu protótipo é: FILE *fopen (char *nome_do_arquivo,char

- fopen()

Esta é a função de abertura de arquivos. Seuprotótipo é:

FILE *fopen (char *nome_do_arquivo,char *modo);

Manipulação de Arquivos

514

Page 4: Manipulação de Arquivosmarcelo.linder/arquivos_iapCA/material_semes… · -fopen() Esta é a função de abertura de arquivos. Seu protótipo é: FILE *fopen (char *nome_do_arquivo,char

515

Page 5: Manipulação de Arquivosmarcelo.linder/arquivos_iapCA/material_semes… · -fopen() Esta é a função de abertura de arquivos. Seu protótipo é: FILE *fopen (char *nome_do_arquivo,char

Poderíamos então, para abrir um arquivo bináriopara escrita, escrever:

...

FILE *fp;

fp=fopen ("exemplo.bin","wb");

Manipulação de Arquivos

516

fp=fopen ("exemplo.bin","wb");

if (!fp)

printf ("Erro na abertura do arquivo.");

A condição !fp testa se o arquivo foi aberto comsucesso, porque no caso de um erro a funçãofopen() retorna um ponteiro nulo (NULL).

Page 6: Manipulação de Arquivosmarcelo.linder/arquivos_iapCA/material_semes… · -fopen() Esta é a função de abertura de arquivos. Seu protótipo é: FILE *fopen (char *nome_do_arquivo,char

Uma vez aberto um arquivo, vamos poder ler ouescrever nele utilizando as funções disponíveis emstdio.h.

Toda vez que estamos trabalhando comarquivos, há uma espécie de posição atual noarquivo. Esta é a posição de onde será lido ou

Manipulação de Arquivos

517

arquivo. Esta é a posição de onde será lido ouescrito o próximo dado. Normalmente, num acessosequencial a um arquivo, não temos que mexernesta posição. Pois, quando lemos um dado aposição no arquivo é automaticamente atualizada.Num acesso randômico teremos que mexer nestaposição.

Page 7: Manipulação de Arquivosmarcelo.linder/arquivos_iapCA/material_semes… · -fopen() Esta é a função de abertura de arquivos. Seu protótipo é: FILE *fopen (char *nome_do_arquivo,char

- fclose

Quando acabamos de usar um arquivo queabrimos, devemos fechá-lo. Para tanto, usa-sea função fclose(), cujo protótipo é:

Manipulação de Arquivos

518

int fclose (FILE *fp);

O ponteiro fp passado à função fclose()determina o arquivo a ser fechado. A funçãoretorna zero no caso de sucesso.

Page 8: Manipulação de Arquivosmarcelo.linder/arquivos_iapCA/material_semes… · -fopen() Esta é a função de abertura de arquivos. Seu protótipo é: FILE *fopen (char *nome_do_arquivo,char

Fechar um arquivo faz com que qualquerdado que tenha permanecido no "buffer"associado ao fluxo de saída seja gravado.

Manipulação de Arquivos

519

A função exit() fecha todos os arquivos queum programa tiver aberto.

Veremos a seguir algumas funçõesutilizadas na manipulação de arquivos.

Page 9: Manipulação de Arquivosmarcelo.linder/arquivos_iapCA/material_semes… · -fopen() Esta é a função de abertura de arquivos. Seu protótipo é: FILE *fopen (char *nome_do_arquivo,char

- putc

A função putc é uma função de escrita emarquivo. Seu protótipo é:

int putc (int ch, FILE *fp);

Manipulação de Arquivos

520

int putc (int ch, FILE *fp);

A referida função escreve um caractere noarquivo apontado por fp.

O que putc() retorna? e para que é útileste retorno?

Page 10: Manipulação de Arquivosmarcelo.linder/arquivos_iapCA/material_semes… · -fopen() Esta é a função de abertura de arquivos. Seu protótipo é: FILE *fopen (char *nome_do_arquivo,char

#include <stdio.h> /*Exemplo*/

int main() {

FILE *fp;

char c;

fp = fopen("arquivo.txt","w");

if(!fp) {

printf( "Erro na abertura do arquivo");

exit(1);

}

521

printf("Entre com um caractere para ser gravado no arquivo: ");

scanf("%c", &c);

putc(c, fp); /*Deveria ter sido analisado o retorno de putc()?*/

fclose(fp);

return 0;

}

Page 11: Manipulação de Arquivosmarcelo.linder/arquivos_iapCA/material_semes… · -fopen() Esta é a função de abertura de arquivos. Seu protótipo é: FILE *fopen (char *nome_do_arquivo,char

#include <stdio.h> /*Exemplo*/

int main() {

FILE *fp;

char c;

fp = fopen("arquivo.txt","w");

if(!fp) {

printf( "Erro na abertura do arquivo");

exit(1);

}

522

printf("Entre com um caractere para ser gravado no arquivo: ");

scanf("%c", &c);

if (c == (char) putc(c, fp))

printf("Tudo deu certo!");

else

prinff("Ocorreu um erro!");

fclose(fp);

return 0;

}

Page 12: Manipulação de Arquivosmarcelo.linder/arquivos_iapCA/material_semes… · -fopen() Esta é a função de abertura de arquivos. Seu protótipo é: FILE *fopen (char *nome_do_arquivo,char

Exercício:

Com o que vimos até o momento sobremanipulação de arquivos. Construa umafunção em C que possua a capacidade de

Manipulação de Arquivos

523

função em C que possua a capacidade deescrever uma string em um arquivo texto.Escreva um programa que se utilizaadequadamente da função que vocêimplementou.

Page 13: Manipulação de Arquivosmarcelo.linder/arquivos_iapCA/material_semes… · -fopen() Esta é a função de abertura de arquivos. Seu protótipo é: FILE *fopen (char *nome_do_arquivo,char

#include <stdio.h>

void putStrInFile (FILE *, char*);

int main()

{

FILE *fp;

char string[100];

int i;

fp = fopen("arquivo.txt","w");

if(!fp)

{

524

{

printf( "Erro na abertura do arquivo");

exit(1);

}

printf("Entre com a string a ser gravada no arquivo:");

scanf("%[^\n]", string);

putStrInFile (fp, string) ;

fclose(fp);

return 0;

}

Page 14: Manipulação de Arquivosmarcelo.linder/arquivos_iapCA/material_semes… · -fopen() Esta é a função de abertura de arquivos. Seu protótipo é: FILE *fopen (char *nome_do_arquivo,char

void putStrInFile (FILE *fp, char* string)

{

int i;

for(i=0; string[i]; i++)

putc(string[i], fp); /*Não testei se o caractere foi escritocom sucesso.*/

}

525

Page 15: Manipulação de Arquivosmarcelo.linder/arquivos_iapCA/material_semes… · -fopen() Esta é a função de abertura de arquivos. Seu protótipo é: FILE *fopen (char *nome_do_arquivo,char

- getc

Seu protótipo é:

int getc (FILE *fp);

A função retorna um caractere lido do arquivoapontado por fp. OBS.: Equivalente à fgetc().

Manipulação de Arquivos

526

Exercício:

Construa um função em C que possua acapacidade de ler e apresentar na saída padrãouma string contida em um arquivo texto.

Page 16: Manipulação de Arquivosmarcelo.linder/arquivos_iapCA/material_semes… · -fopen() Esta é a função de abertura de arquivos. Seu protótipo é: FILE *fopen (char *nome_do_arquivo,char

- feof

EOF ("End Of File") indica o fim de um arquivo.Às vezes, é necessário verificar se um arquivochegou ao fim. Para isto podemos usar a funçãofeof(). Ela retorna não-zero se o arquivo chegouao EOF, caso contrário retorna zero.

Seu protótipo é:

Manipulação de Arquivos

527

Seu protótipo é:

int feof (FILE *fp);

Outra forma de se verificar se o final do arquivofoi atingido é comparar o caractere lido por getc()com EOF. O programa a seguir abre um arquivo jáexistente e o lê, caractere por caractere, até que ofinal do arquivo seja atingido. Os caracteres lidossão apresentados na tela:

Page 17: Manipulação de Arquivosmarcelo.linder/arquivos_iapCA/material_semes… · -fopen() Esta é a função de abertura de arquivos. Seu protótipo é: FILE *fopen (char *nome_do_arquivo,char

#include <stdio.h>

int main()

{FILE *fp;int c;fp = fopen("arquivo.txt","r"); if(!fp){

printf( "Erro na abertura do arquivo");

528

printf( "Erro na abertura do arquivo");exit(1);

}while((c = getc(fp) ) != EOF)

printf("%c", (char)c);

fclose(fp);return 0;

}

Page 18: Manipulação de Arquivosmarcelo.linder/arquivos_iapCA/material_semes… · -fopen() Esta é a função de abertura de arquivos. Seu protótipo é: FILE *fopen (char *nome_do_arquivo,char

#include <stdio.h>

int main()

{FILE *fp;fp = fopen("arquivo.txt","r"); if(!fp){

printf( "Erro na abertura do arquivo");

529

printf( "Erro na abertura do arquivo");exit(1);

}while(!feof(fp))

printf("%c", (char)getc(fp));

fclose(fp);return 0;

}

Page 19: Manipulação de Arquivosmarcelo.linder/arquivos_iapCA/material_semes… · -fopen() Esta é a função de abertura de arquivos. Seu protótipo é: FILE *fopen (char *nome_do_arquivo,char

/*Resposta de exercício do slide 512*/

void get_string(FILE *fp)

{

int c;

while ((c = getc(fp)) != EOF)

printf("%c", (char)c);

530

printf("%c", (char)c);

}

Page 20: Manipulação de Arquivosmarcelo.linder/arquivos_iapCA/material_semes… · -fopen() Esta é a função de abertura de arquivos. Seu protótipo é: FILE *fopen (char *nome_do_arquivo,char

- Arquivos pré-definidosQuando se começa a execução de um programa,

o sistema automaticamente abre alguns arquivospré-definidos:

stdin: dispositivo de entrada padrão (geralmenteo teclado);

stdout: dispositivo de saída padrão (geralmente o

Manipulação de Arquivos

531

stdout: dispositivo de saída padrão (geralmente ovídeo);

stderr: dispositivo de saída de erro padrão(geralmente o vídeo);

stdaux: dispositivo de saída auxiliar (em muitossistemas, associado à porta serial);

stdprn : dispositivo de impressão padrão (emmuitos sistemas, associado à porta paralela).

Page 21: Manipulação de Arquivosmarcelo.linder/arquivos_iapCA/material_semes… · -fopen() Esta é a função de abertura de arquivos. Seu protótipo é: FILE *fopen (char *nome_do_arquivo,char

Cada uma destas constantes pode serutilizada como um ponteiro para FILE, paraacessar os periféricos associados a eles.

Desta maneira, pode-se, por exemplo, usar:

char ch = (char)getc(stdin);

Manipulação de Arquivos

532

char ch = (char)getc(stdin);

para efetuar a leitura de um caractere apartir do teclado, ou:

putc(ch, stdout);

para imprimir o mesmo no monitor.

Page 22: Manipulação de Arquivosmarcelo.linder/arquivos_iapCA/material_semes… · -fopen() Esta é a função de abertura de arquivos. Seu protótipo é: FILE *fopen (char *nome_do_arquivo,char

Com base no que vimos, podemos agoraentender melhor o processo de leitura devalores fornecidos través da entrada padrão.

Sempre que nos utilizamos de uma funçãopara leitura de valores através do teclado,estamos solicitando que seja efetuada uma

Manipulação de Arquivos

533

estamos solicitando que seja efetuada umaleitura na stream (buffer) que representa oarquivo apontado por stdin.

Quando não é encontrado algo na streamocorre uma espera pelo fornecimento devalores através do teclado, ou melhor,ocorre uma espera por pressionamento(s)de tecla(s) no teclado.

Page 23: Manipulação de Arquivosmarcelo.linder/arquivos_iapCA/material_semes… · -fopen() Esta é a função de abertura de arquivos. Seu protótipo é: FILE *fopen (char *nome_do_arquivo,char

Já vimos alguns conceitos associados aoprocesso de compilação. Porém, dispersos entreos demais conteúdos. Vamos relembrá-los agora:

- Definição de macros, quando vimos o #define;

- Diretivas para compilação, quando vimos o -o e o-lm;

Programa make

534

-lm;

- Arquivos de cabeçalho, quando vimos osarquivos .h;

- Divisão do projeto em arquivos separados,quando trabalhamos a Definição de bibliotecas deligação estática.

Page 24: Manipulação de Arquivosmarcelo.linder/arquivos_iapCA/material_semes… · -fopen() Esta é a função de abertura de arquivos. Seu protótipo é: FILE *fopen (char *nome_do_arquivo,char

O último tópico de nosso conteúdo programáticoé: Compilação separada com o uso do programamake.

O make é uma ferramenta que controla ageração de executáveis e outros arquivos não-fonte de um programa a partir de arquivos fonte do

Programa make

535

fonte de um programa a partir de arquivos fonte doprograma.

O make recebe o seu conhecimento sobre comoconstruir o seu programa a partir de um arquivochamado makefile, que lista cada um dos arquivosnão-fonte e como gerá-lo de outros arquivos.

Page 25: Manipulação de Arquivosmarcelo.linder/arquivos_iapCA/material_semes… · -fopen() Esta é a função de abertura de arquivos. Seu protótipo é: FILE *fopen (char *nome_do_arquivo,char

É interessante que o programador ao escreverum programa, escreva um makefile para ele, demodo que seja possível utilizar o make paraconstruir e instalar o programa.

Mais sobre make pode ser encontrado no linkhttp://mrbook.org/tutorials/make/

Programa make

536

http://mrbook.org/tutorials/make/

Page 26: Manipulação de Arquivosmarcelo.linder/arquivos_iapCA/material_semes… · -fopen() Esta é a função de abertura de arquivos. Seu protótipo é: FILE *fopen (char *nome_do_arquivo,char

FIM!

537537

FIM!