// [23/11/2004]
// MAC110 - 2004
//
// Arquivos: primeiro exemplo com leitura de arquivo
//
// Compilando: gcc -o arquivo1.o arquivo1.c
//
// Uso: ./arquivo1 nome_arquivo
//      (sendo "nome_arquivo" o nome COMPLETO do arquivo de entrada)
//
// "entradas.txt": contrua um arquivo com nome "entradas.txt" e coloque lá, p.e,
//  | este é um exemplo com várias entradas, contendo números
//  | de vários tipos
//  | inteiros 123 123 -232
//  | "flutuantes" como 1.24, 33.2 (note que a ',' também serve para separá-lo)
//
// Uso: ./arquivo entradas.txt

#include <stdio.h>

#define MAXLNH 255 // tamanho máximo p/ara leitura de uma linha num arquivo de texto

int main (int argc, char *argv[]) {
  FILE *arq_ent, // apontador para o aquivo de entrada
       *arq_sai; // apontador para o aquivo de saídas
  char nome_arq_saida [] = "saidas.txt";
  char //*linha; // para ler uma linha de texto
       linha[MAXLNH];
  int i1, i2, i3;
  float f1, f2, f3;
  char c1, c2;
  int lnh; // auxiliar para contar número de linhas lidas
  int i; 

  printf("\n\n+---------------------------------------+\n");
  printf(    "| Exemplo de entrada/saída via arquivos |\n");
  printf(    "+---------------------------------------+\n");

  printf("O nome do arquivo de entrada é: %s\n", argv[1]); // em argv[0] está "arquivo1.o"

  arq_ent = fopen(argv[1], "r"); // "arq" recebe o arquivo de nome dados pelo parâmetro
  if (!arq_ent) { // erro, talvez o arq. não exista
     printf("Erro, talvez o arq. %s não exista", argv[1]);
     exit(1);
     }

  // Algumas leituras particulares

  // Linha 1
  fgets(linha, MAXLNH, arq_ent); // lê primeira linha
  printf("Primeira linha: %s\n", linha);

  // Linha 2
  fgets(linha, MAXLNH, arq_ent); // lê segunda linha
  printf("Segunda linha: %s\n", linha);

  // Linha 3
  fscanf(arq_ent, "%s", linha);
  printf("Primeira parte de terceira linha: %s\n", linha);

  fscanf(arq_ent, "%d %d %d", &i1, &i2, &i3); // tenta ler próximas três partes como inteiro (se forem!!)
  printf("Próximas partes de terceira linha: %d -> %d -> %d\n", i1, i2, i3);

  // Linha 4
  fscanf(arq_ent, "%s", linha);
  printf("Primeira parte de terceira linha: %s\n", linha);

  fscanf(arq_ent, "%s", linha);
  printf("Segunda parte de terceira linha: %s\n", linha);

 // tenta ler próximas três partes como "floats" e "char" (se forem!!)
  fscanf(arq_ent, "%f %c %f %c %f", &f1, &c1, &f2, &c2, &f3);
  printf("Próximas partes de terceira linha: %f -> %c -> %f -> %c -> %f\n", f1, c1, f2, c2, f3);

  fclose(arq_ent); // fecha o arquivo de entrada (evita erros)

  // Agora começa tudo de novo, mas lendo tudo se fosse um texto e escrevendo no arquivo
  // de saída que receberá o nome (fixo no caso) de "saidas.txt" (em "nome_arq_saida")
  arq_ent=fopen(argv[1],"r");
  if (!arq_ent) { printf("ERRO em %s\n", argv[1]); exit(0); }
  arq_sai=fopen(nome_arq_saida,"w"); // nome do arquivo de saída
  // "Cabeçalho" do arquivo de saída
  fprintf(arq_sai, "Este é o arquivo de saída gerado pelo programa: %s\n\n", argv[0]);
  fprintf(arq_sai, "O arquivo de entrada foi o: %s\n", argv[1]);
  fprintf(arq_sai, "O conteúdo de %s vem a seguir, numerando as linhas:\n",argv[1]);
  lnh = 0; // nenhuma linha escrita na saída até agora
  while ( (fgets(linha, MAXLNH, arq_ent)) != NULL ) {
    i=0;
    // Constrói uma linha inteira
    while (*(linha+i)!='\0') {
          if (*(linha+i)=='/' && *(linha+i+1)=='/') {/* comentario */
             *(linha+i)= '\n'; /* temina string */
             *(linha+i+1)= '\0'; /* termina linha */
             }
          i++;
          }
    if (strlen(linha)>1) { // se linha for vazia NÃO a escreva!
       fprintf(arq_sai, "%d: %s", lnh, linha); // escreve no arquivo de saída a linha i
       }
    lnh++; // mais uma linha escrita na saída
    }
  fclose(arq_ent);
  fclose(arq_sai);
  }
