   /**********************************************************
   PROGRAMA aula3.c
   Exemplo de programa que grava um certo numero de bytes em um arquivo
    usando fwrite, e depois le os dados com fread.
   Leia observacoes no final
   **********************************************************/
   #include <string.h>
   #include <stdio.h>

   int main(void)
   {
      FILE *stream;
      char msg[] = "Gravando e lendo 31 caracteres";
      char buf[40];
	int n;

      if ((stream = fopen("teste.txt", "w+"))  == NULL)
         {
           fprintf(stderr,"Nao consegue abrir o arquivo de saida.\n");
           return 1;
          }

      /* Gravando os bytes da string no arquivo */
      fwrite(msg, strlen(msg)+1,1, stream);

      /* Posiciona o arquivo no inicio */
      fseek(stream, 0, SEEK_SET);
      /* Le os bytes do arquivo e mostra na tela */
      n = fread(buf, strlen(msg)+1, 1, stream);
      printf ("Lidos %d itens\n", n);
      printf("%s\n", buf);
      fclose(stream);
      return 0;
   }

   
/********************************************************************** 
 OBSERVACOES: 
1.  O arquivo "texte.txt" e' criado, em modo w+, significando que ser 
    criado um novo arquivo, e que podera' ser gravado e lido. 

2.  A frase:  fwrite(msg, strlen(msg)+1, 1, stream); 
    grava no arquivo 1 item de 31 bytes (a frase tem 30 bytes, mais o '/0' 
    final) a partir do endereco msg.  A funcao strlen() esta' definida em 
    string.h, e retorna o numero de caracteres da string (sem contar o '\0'). 

3.  A funcao fread tem a seguinte definicao: 
       size_t fread(void *ptr, size_t  tamanho,  size_t n, FILE *stream); 
    Ela e' usada para ler n itens, cada um com tamanho bytes, do 
    arquivo apontado por stream. Os bytes lidos vao para uma area da 
    memoria (um buffer) previamente alocada com tamanho suficiente, seja 
    com malloc, seja com um vetor, e apontada por ptr. No caso desse exemplo, 
    foi usado um vetor com capacidade de 40 caracteres (char buf[40] ). 
    A funcao fread retorna o numero de itens lidos (nao de bytes), que sera' 
    do tipo size_t. (Na pratica um inteiro longo) 

    NOTA: O tipo size_t acima e' pre'-definido em stdio.h, para uso com 
    tamanhos de memoria. Varias funcoes usam esse tipo para parametros e 
    retorno. Por exemplo, a funcao strlen, em <string.h>, que retorna o 
    numero de caracteres de uma string (sem o '\0' final) tem a seguinte 
    definicao: 
        size_t strlen(const char *s); 

4. A funcao fseek permite mover o indicador de posicao do arquivo, de modo 
   a conseguir acesso nao sequencial. Ela e' definida com o prototipo: 
       int fseek(FILE *stream, long deslocamento, int de_onde); 
   onde os parametros significam: 
       stream: o ponteiro para o arquivo 
       de_onde: uma macro pre'-definida em stdio.h que contem a posicao a 
                partir da qual sera' feito o deslocamento. 
          SEEK_SET   inicio do arquivo 
          SEEK_CUR   posiacao atual do arquivo 
          SEEK_END   fim do arquivo 
       deslocamento: numero de bytes contados a partir da posicao definida 
                     pelo parametro de_onde (sera' negativo, se contar a 
                     partir do fim do arquivo) 
   FIM DO PROGRAMA aula3.c 
**********************************************************************/ 
