Protótipo:
int ferror (FILE *fp);
A função ferror() se torna muito útil quando queremos verificar se cada acesso a um arquivo teve sucesso. Cada vez que uma função de arquivo é executada, a própria função registra numa variável especial se houve sucesso na operação ou não. Com ferror() podemos ter acesso ao conteúdo desta variável: ela retorna não zero se houve algum erro na última função de acesso ao arquivo.
A função rewind() de protótipo
void rewind (FILE *fp);
retorna a posição corrente do arquivo para o início.
getw() lê no arquivo um inteiro. Seu protótipo é:
int getw (FILE *fp);
putw() escreve um inteiro num arquivo. Protótipo:
int putw (int i,FILE *fp);
Para se ler uma string num arquivo podemos usar fgets() cujo protótipo é:
char *fgets (char *str,int tamanho,FILE *fp);
A string str lida deve ter seu tamanho determinado pelo programador.
Protótipo:
char *fputs (char *str,FILE *fp);
Escreve uma string num arquivo.
Podemos escrever e ler blocos de dados. Para tanto temos as funções fread() e fwrite(). O protótipo de fread() é:
unsigned fread (void *buffer,int numero_de_bytes,int count,FILE *fp);
O buffer é a região de memória na qual serão armazenados os dados lidos. O número de bytes é o tamanho da unidade a ser lida. O contador indica quantas unidades devem ser lidas. Isto significa que o número total de bytes lidos é:
numero_de_bytes*count
A função retorna o número de unidades efetivamente lidas. Este número pode ser menor que o valor requisitado quando o fim do arquivo for encontrado.
A função fwrite() funciona como a sua companheira fread(). Seu protótipo é:
unsigned fwrite(void *buffer,int numero_de_bytes,int count,FILE *fp);
Para se fazer procuras e acessos randômicos usa-se a função fseek(). Esta move o cursor no arquivo de um valor especificado, a partir de um ponto especificado. Seu protótipo é:
int fseek (FILE *fp,long numbytes,int origem);
O parâmetro de origem determina a partir de onde é que os bytes de movimentação serão contados. Os valores possíveis são definidos por macros no arquivo cabeçalho e são:
Nome |
Valor |
Significado |
SEEK_SET |
0 |
Início do arquivo |
SEEK_CUR |
1 |
Ponto corrente no arquivo |
SEEK_END |
2 |
Fim do arquivo |
Tendo-se definido a partir de onde irá se contar numbytes determina quantos bytes de deslocamento será dado na posição atual.
Protótipo:
int remove (char *nome_do_arquivo);
Desmancha um arquivo especificado.
O exercício da página anterior poderia ser reescrito usando-se, por exemplo, fgets() e fputs(), ou fwrite() e fread(). A seguir apresentamos uma segunda versão que se usa das funções fgets() e fputs(), e que acrescenta algumas inovações.
#include <stdio.h #include <stdlib.h #include <string.h void main() { FILE *p; char str[30], frase[80] = "Este e um arquivo chamado: ", resposta[80]; int i; /* Le um nome para o arquivo a ser aberto: */ printf("\n\n Entre com um nome para o arquivo:\n"); gets(str); if (!(p = fopen(str,"w"))) /* Caso ocorra algum erro na abertura do arquivo..*/ { /* o programa aborta automaticamente */ printf("Erro! Impossivel abrir o arquivo!\n"); exit(1); } /* Se nao houve erro, imprime no arquivo, fecha ...*/ fputs(frase, p); fputs(str,p); /* E se o seu disco estiver muito cheio.. */ if (ferror(p)) printf("\nNem tudo sao flores...\n"); fclose(p); strcat(frase, str); /* abre novamente para a leitura e fecha. */ p = fopen(str,"r"); fgets(resposta, strlen(frase)+1, p); printf("\n\n%s\n", resposta); fclose(p); remove(str); }