Lendo um arquivo de entrada


Para usar um arquivo como entrada do seu programa, crie inicialmente uma variável do tipo FILE. Por exemplo:

FILE *arqentrada;

onde arqentrada é o nome da variável que deve ser obrigatoriamente do tipo ponteiro. Antes de ler qualquer dado do arquivo, você deve abrí-lo para leitura. Para isso, você deve usar o comando fopen, por exemplo:

arqentrada = fopen( "entrada.txt", "r" );

O primeiro argumento é o nome do arquivo a ser aberto. O segundo argumento "r" significa "read" (arquivo para leitura). O comando fopen devolve um ponteiro que deve ser armazenado na variável do tipo FILE que você criou anteriormente. Se por algum motivo ele não conseguir abrir o arquivo (por exemplo, o arquivo não existe), fopen devolve um ponteiro nulo.

Agora que o arquivo está aberto, você pode ler seus dados usando o comando fscanf. Ele é idêntico ao comando scanf, com a diferença que o primeiro argumento é o ponteiro do arquivo. Por exemplo:

fscanf(arqentrada, "%c", &letra);

O comando acima lê um caracter do arquivo e armazena-o na variável letra.

Para ver se você já chegou ao fim do arquivo, use a função feof(arqentrada). Ela devolve verdadeiro se o fim do arquivo for alcançado. Ao final da leitura, deve-se sempre fechar o arquivo usando o comando fclose(arqentrada). Veja o programa exemplo a seguir:

/* Este programa lê um arquivo chamado "entrada.txt"
   e imprime o seu conteúdo na tela */

#include <stdio.h>

int main() {
    FILE *arqentrada;
    char letra;

    /* abre o arquivo para leitura */
    arqentrada = fopen("entrada.txt", "r");

    /* se não conseguiu abrir o arquivo */
    if (arqentrada == NULL) {
        printf("Não consegui abrir o arquivo.\n");
        return 0;
    }

    /* enquanto não for fim do arquivo */
    while (!feof(arqentrada)) {

        /* lê o próximo caracter */
        fscanf(arqentrada, "%c", &letra);

        /* imprime o caracter na tela */
        printf("%c", letra);
    }

    /* fecha o arquivo */
    fclose(arqentrada);

    return 0;
}

Para testar esse exemplo, você vai precisar de um arquivo texto chamado "entrada.txt". Se você usar o lcc, após a compilação, o programa executável estará num subdiretório (provavelmente chamado de lcc). O seu arquivo texto deve estar lá para o programa funcionar.

Escrevendo em um arquivo de saída


Para escrever a saída em um arquivo, pode-se proceder de maneira semelhante. Primeiro, cria-se uma variável do tipo FILE, exatamente como foi feito para leitura. Exemplo:

FILE *arqsaida;

Para abrir o arquivo, deve-se usar o comando:

arqsaida = fopen("entrada.txt", "w");

O parâmetro "w" significa "write" (arquivo para escrita). Estando o arquivo aberto, pode-se escrever nele usando o comando fprintf, que é muito semelhante ao comando printf. A diferença, como no fscanf, é que o primeiro parâmetro deve ser o ponteiro para o arquivo. Exemplo:

fprintf(arqsaida, "O valor de x é %d.\n", x);

Este comando imprime o valor da variável x no arquivo de saída. Ao final da escrita, deve-se sempre fechar o arquivo usando o comando fclose(arqsaida). Veja o programa exemplo a seguir.

/* Este programa lê do teclado uma sequência de números inteiros e grava-os
   no arquivo "saida.txt". O programa termina quando o usuário digitar o
   número 0 (zero) */

#include <stdio.h>

/* função que imprime no arquivo */
void imprime( FILE *arqsaida, int x ) {
    fprintf( arqsaida, "%d\n", x );
}

int main() {
  FILE *arqsaida;
  int numero;

  /* abre o arquivo para escrita */
  arqsaida = fopen( "saida.txt", "w" );

  /* se não conseguiu abrir o arquivo */
  if ( arqsaida == NULL ) {
    printf( "Não consegui abrir o arquivo.\n" );
    return 0;
  }

  /* lê o primeiro número */
  printf( "Digite um número (zero para finalizar): " );
  scanf( "%d", &numero );

  /* enquanto o numero digitado não for 0 */
  while ( numero != 0 ) {

    /* imprime o número no arquivo */
    imprime( arqsaida, numero );

    /* lê o próximo número */
    printf( "Digite um número (zero para finalizar): " );
    scanf( "%d", &numero );
  }

  /* fecha o arquivo */
  fclose( arqsaida );
  return 0;
}

Note que, nesse exemplo, a linha que imprime no arquivo foi colocada numa função. Isso não é necessário; o comando fprintf poderia estar na função main. Entretanto, esse exemplo demonstra como a variável arqsaida pode ser passada como parâmetro de uma função.