Author
others
View
0
Download
0
Embed Size (px)
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.
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.
- fopen()
Esta é a função de abertura de arquivos. Seuprotótipo é:
FILE *fopen (char *nome_do_arquivo,char *modo);
Manipulação de Arquivos
514
515
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).
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.
- 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.
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.
- 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?
#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;
}
#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;
}
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.
#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;
}
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
- 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.
- 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:
#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;
}
#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;
}
/*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);
}
- 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).
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.
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.
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.
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.
É 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/
FIM!
537537
FIM!