13a. Aula Manipulação de arquivos 2013.2
O sistema de entrada e saída do ANSI C é composto por uma série de funções (fopen, fprintf, fgets, fclose) cujos protótipos estão reunidos em stdio.h Todas estas funções trabalham com o conceito de "ponteiro de arquivo". Este não é um tipo propriamente dito, mas uma definição usando o comando typedef. Esta definição também está no arquivo stdio.h 2
A função fopenabre um arquivo em disco para gravar ou ler, e cria uma estrutura de dados especial -FILE -que C utiliza internamente para descrever o arquivo. A função fprintfgrava itens de informação em um arquivo aberto, seguindo as especificações de formato que você fornece em um argumento para a função. A função fgetslê uma string de caracteres de um arquivo aberto. A função fclosefecha o arquivo quando as operações de entrada e saída estão completas. 3
stdin:dispositivo de entrada padrão (geralmente o teclado) stdout:dispositivo de saída padrão (geralmente o vídeo) stderr:dispositivo de saída de erro padrão (geralmente o vídeo) stdaux:dispositivo de saída auxiliar (em muitos sistemas, associado à porta serial) stdprn:dispositivo de impressão padrão (em muitos sistemas, associado à porta paralela) 4
Representa o arquivo em operações de entrada ou saída. Funções de I/O em arquivos pedem essa variável ponteiro FILE como um de seus argumentos. A variável ponteiro FILE é o identificador que representa o arquivo enquanto ele estiver aberto. Sintaxe: FILE *ponteirodearquivo; 5
Função para abertura/criação de um arquivo: fopen() FILE *fopen(char*nome_do_arquivo,char*modo); O nome_do_arquivodetermina qual arquivo deverá ser aberto. Este nome deve ser válido no sistema operacional que estiver sendo utilizado. O modode abertura diz à função fopen() que tipo de uso você vai fazer do arquivo. 6
"r" Abre um arquivo texto para leitura. O arquivo deve existir antes de ser aberto. "w" Abrir 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" Abrir um arquivo texto para gravação. Os dados serão adicionados no fim do arquivo ("append"), se ele já existir, ou um novo arquivo será criado, no caso de arquivo não existente anteriormente. "rb" Abre um arquivo binário para leitura. Igual ao modo "r" anterior, só que o arquivo é binário. 7
"wb" Cria um arquivo binário para escrita, como no modo "w" anterior, só que o arquivo é binário. "ab" Acrescenta dados binários no fim do arquivo, como no modo "a" anterior, só que o arquivo é 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 existir, o conteúdo anterior será destruído. Se não existir, será criado. 8
"a+" Abre um arquivo texto para gravação e leitura. Os dados serão adicionados no fim do arquivo se ele já existir, ou um novo arquivo será criado, no caso de arquivo não existente anteriormente. "r+b" Abre um arquivo binário para leitura e escrita. O mesmo que "r+" acima, só que o arquivo é binário. "w+b" Cria um arquivo binário para leitura e escrita. O mesmo que "w+" acima, só que o arquivo é binário. "a+b" Acrescenta dados ou cria uma arquivo binário para leitura e escrita. O mesmo que "a+" acima, só que o arquivo é binário 9
Quando acabamos de usar um arquivo que abrimos, devemos fechá-lo. Para tanto usa-se a função fclose() cujo protótipo é: int fclose (FILE *p); O ponteiro ppassado à função fclose() determina o arquivo a ser fechado. A função retorna zerono caso de sucesso. 10
#include <stdio.h> #include <conio.h> #include <stdlib.h> main () { FILE *arq; system ("cls"); printf ("Teste com arquivos texto"); arq = fopen ("Cadastro.txt", "wt"); } if ( arq == NULL ) { printf ("\nimpossível criar arquivo Cadastro.txt!"); printf ("\npressione qualquer tecla."); } else if ( fclose(arq)!= 0 ) printf("\nproblemas ao fechar arquivo Cadastro.txt!"); else { printf("\narquivo Cadastro.txt fechado e criado com sucesso!"); printf("\nconfirmando:\n"); system ("dir cadastro.txt"); } getch(); 11
fprintf() Funciona como a função printf() A única diferença é a especificação do arquivo de saída (output) int fprintf (FILE *fp,char *str,...); fscanf() Funciona como a função scanf() A única diferença é a especificação do arquivo de leitura (input) int fscanf (FILE *fp,char *str,...); 12
.. ḟprintf(p,"este e um arquivo chamado:\n%s\n", str); fclose(p); /* abre novamente para a leitura */ p = fopen(str,"r"); while (!feof(p)) { fscanf(p,"%c",&c); printf("%c",c); }... 13
Função fputs() char *fputs (char *str,file *fp); Função fgets() char *fgets (char *str, int tamanho, FILE *fp); str: a string a ser lida tamanho: o limite máximo de caracteres a serem lidos A função lê a string até que um caracterde nova linha seja lido ou tamanho-1 caracteres tenham sido lidos. Se o caracterde nova linha ('\n') for lido, ele fará parte da string A string resultante sempre terminará com '\0' 14
Função fwrite() unsigned fwrite(void *buffer,int numero_de_bytes,int count,file *fp); Função retorna o número total de elementos gravados Esse número pode ser menor do que o que foi especificado na chamada da rotina. 15
Função fread() unsigned fread (void *buffer, int numero_de_bytes, int count, FILE *fp); Função retorna o número total de elementos lidos Esse número pode ser menor do que o que foi especificado na chamada da rotina 16
Para se fazer buscas e acesso aleatório int fseek (FILE *fp,long numbytes,int origem); Esta move a posição corrente de leitura ou escrita no arquivo de um valor especificado, a partir de um ponto especificado O parâmetro origemdetermina a partir de onde os numbytes de movimentação serão contado Os valores possíveis são definidos por macros em stdio.h: SEEK_SET 0 Início do arquivo SEEK_CUR 1 Ponto corrente no arquivo SEEK_END 2 Fim do arquivo 17
Função para checar se a última operação de input/output foi bem sucedida: ferror() int ferror (FILE *fp); A função retorna zero, se nenhum erro ocorreu e um número diferente de zero se algum erro ocorreu durante o acesso ao arquivo. ferror() se torna muito útil quando queremos verificar se cada acesso a um arquivo teve sucesso, de modo que consigamos garantir a integridade dos nossos dados. Na maioria dos casos, se um arquivo pode ser aberto, ele pode ser lido ou gravado. Porém, existem situações em que isto não ocorre. 18
Função para gravar um único caracter: putc() int putc(char ch, FILE *fp); 19
rewind() retorna a posição corrente do arquivo para o início. void rewind (FILE *fp); remove() apaga um arquivo especificado. int remove (char *nome_do_arquivo); 20
FUNÇÃO FINALIDADE fopen( ) fclose( ) putc( ) Abrir um arquivo Fechar um arquivo Escrever um caracter em um arquivo fputc( ) Idem putc( ) getc( ) Ler um caracterde um arquivo fgetc( ) Idem getc( ) fseek( ) Posicionar o ponteiro de arquivo num byte específico fprintf( ) fscanf( ) feof( ) ferror( ) rewind( ) remove( ) fflush( ) É para o arquivo o queprintfé para o console É para o arquivo o quescanfé para o console Devolve verdadeiro se o fim do arquivo foi atingido Devolve verdadeiro se ocorreu um erro Posicionar o ponteiro de arquivo no início deste Apagar um arquivo Descarregar um arquivo 21