#include <stdio.h>
#include <stdlib.h>

FILE *arquivo;

int escolhe () {
  int opcao;

  do {
    printf ("\n");
    printf ("Escolha uma opcao:\n");
    printf ("1 - Ver arquivo\n");
    printf ("2 - Adicionar linhas ao arquivo\n");
    printf ("3 - Sair\n");
    scanf ("%d",&opcao);
  } while (opcao<1||opcao>3);

  return opcao;
}

void MostraArq() {
  char lido[256];
  int aguarda;
  
  // vai para o inicio do arquivo
  rewind(arquivo);

  printf ("------ inicio do arquivo ------\n");
  do {
    fgets(lido,256,arquivo);
    if (feof(arquivo)) {
       printf ("------ fim do arquivo ------\n");
       break;
    }
    printf ("%s",lido);
  } while (!feof(arquivo));

  // vai para o fim do arquivo
  fseek(arquivo,0,SEEK_END);
}

void EscreveArq() {
  char escreve[255];
  char lixo[255];
  int aguarda;

  // a linha abaixo e so para limpar o  buffer do teclado
  // leia observacao no final do programa
  gets(lixo);

  printf ("Digite uma linha de texto:\n");
  gets(escreve);
  fprintf (arquivo,"%s\n",escreve);
  printf ("Linha adicionada ao arquivo\n");
}

main () {
  int opcao;
  char path[255], linha[255];

  printf ("Nome do arquivo:");
  scanf ("%s",path);

  // abre o arquivo no modo append - adicionar dados
  // ao final do arquivo
  arquivo = fopen(path,"a+");

  do {
    opcao = escolhe();
    fflush(stdin);
    if (opcao == 1) MostraArq();
    if (opcao == 2) EscreveArq();
  } while (opcao!=3);

  printf ("Ate a proxima!\n");

  fclose(arquivo);
}

/*
  Observacao:  note que foi usado um gets adicional na funcao EscreveArq
               isto foi necessario porque toda vez que há leitura do te-
               clado usando a funcao scanf e apos uma leitura usando 
               gets, o ultimo caracter teclado fica armazenado numa area
               de memoria chamada buffer. Quando e chamada a funcao gets,
               o conteudo desta area de memoria e descarregado. Como
               lemos a opcao do usuario usando scanf, este buffer fica
               "sujo" com a ultima opcao teclada. Fazemos gets(lixo)
               antes de realmente ler a linha do usuario com
               gets(escreve) para evitar que esta "sujeira" seja gravada
               no arquivo. Experimente retirar o comando gets(lixo), 
               compilar e exectar novamente o programa para ver o 
               resultado.
*/
