/* Le um novo caracter no arquivo */}fclose(p); /* Fecha o arquivo */}Auto-AvaliacaoVeja como voce esta: escreva um programa que abra um arquivo texto e conte o numerode caracteres presentes nele. Imprima o numero de caracteres na tela.Outros Comandos de Acesso a ArquivosArquivos pre-definidosQuando se comeca a execucao de um programa, o sistema automaticamente abre algunsarquivos pre-definidos:stdin: dispositivo de entrada padrao (geralmente o teclado)stdout: dispositivo de saida padrao (geralmente o video)stderr: dispositivo de saida de erro padrao (geralmente o video)stdaux: dispositivo de saida auxiliar (em muitos sistemas, associado a portaserial)80stdprn : dispositivo de impressao padrao (em muitos sistemas, associado aporta paralela)Cada uma destas constantes pode ser utilizada como um ponteiro para FILE, para acessaros perifericos associados a eles. Desta maneira, pode-se, por exemplo, usar:ch =getc(stdin);para efetuar a leitura de um caracter a partir do teclado, ou :putc(ch, stdout);para imprimi-lo na tela.fgetsPara se ler uma string num arquivo podemos usar fgets() cujo prototipo e:char *fgets (char *str, int tamanho,FILE *fp);A funcao recebe 3 argumentos: a string a ser lida, o limite maximo de caracteres a seremlidos e o ponteiro para FILE, que esta associado ao arquivo de onde a string sera lida. A funcaole a string ate que um caracter de nova linha seja lido ou tamanho-1 caracteres tenham sidolidos. Se o caracter de nova linha (\n) for lido, ele fara parte da string, o que nao aconteciacom gets. A string resultante sempre terminara com \0 (por isto somente tamanho-1caracteres, no maximo, serao lidos).A funcao fgets e semelhante a funcao gets() porem, alem dela poder fazer a leitura apartir de um arquivo de dados e incluir o caracter de nova linha na string, ela ainda especificao tamanho maximo da string de entrada. Como vimos, a funcao gets nao tinha este controle, oque poderia acarretar erros de "estouro de buffer". Portanto, levando em conta que o ponteirofp pode ser substituido por stdin, como vimos acima, uma alternativa ao uso de gets e usar aseguinte construcao:fgets (str, tamanho, stdin);onde str e a string que se esta lendo e tamanho deve ser igual ao tamanho alocado paraa string subtraido de 1, por causa do \0.fputsPrototipo:char *fputs (char *str,FILE *fp);Escreve uma string num arquivo.ferror e perrorPrototipo de ferror:int ferror (FILE *fp);A funcao retorna zero, se nenhum erro ocorreu e um numero diferente de zero se algumerro ocorreu durante o acesso ao arquivo.ferror() se torna muito util quando queremos verificar se cada acesso a um arquivo tevesucesso, de modo que consigamos garantir a integridade dos nossos dados. Na maioria doscasos, se um arquivo pode ser aberto, ele pode ser lido ou gravado. Porem, existem situacoes81em que isto nao ocorre. Por exemplo, pode acabar o espaco em disco enquanto gravamos, ouo disco pode estar com problemas e nao conseguimos ler, etc.Uma funcao que pode ser usada em conjunto com ferror() e a funcao perror() (printerror), cujo argumento e uma string que normalmente indica em que parte do programa oproblema ocorreu.No exemplo a seguir, fazemos uso de ferror, perror e fputs#include <stdio.h>#include <stdlib.h>int main(){FILE *pf;char string[100];if((pf = fopen("arquivo.txt","w")) ==NULL){printf("\nNao consigo abrir o arquivo ! ");exit(1);}do{printf("\nDigite uma nova string. Para terminar,