C não complica o manuseio de texto. Ele remove as camadas de abstração e deixa você com a mecânica bruta. Se você está lendo a documentação C, provavelmente notou que todas as funções de entrada/saída de texto ficam dentro da biblioteca stdio. Isso significa entrada/saída padrão. É a base de como os programas C se comunicam com o mundo exterior.

A maioria dos iniciantes começa com stdin e stdout. Esses são fluxos padrão. Eles representam onde um programa obtém dados e envia resultados. Se seu aplicativo precisar apenas de uma fonte de entrada e um coletor de saída, você não precisará de um gerenciamento complexo de arquivos. Você apenas canaliza os dados através da linha de comando.

Os seis fluxos básicos

O cabeçalho stdio fornece seis comandos específicos para interagir com esses fluxos. Eles são simples. Direto.

  • printf : Grava texto formatado em stdout.
  • scanf : Lê dados formatados de stdin.
  • puts : Envia uma string para a tela.
  • gets : Lê uma linha de texto do teclado.
  • putc : Grava um único caractere em stdout.
  • getc ou getchar : Lê um único caractere de stdin.

Por que usar isso? Porque você pode redirecioná-los. É aqui que C brilha. Você não precisa alterar seu código para ler um arquivo em vez de um teclado. Você apenas altera o comando digitado no terminal.

Contando caracteres da maneira mais fácil

Vejamos um exemplo prático. Imagine que você deseja um programa que conte o total de caracteres em uma entrada de texto. Aqui está o código:

Este código aguarda entrada. Você digita linhas. Quando terminar, pressione CTRL-D. Isso sinaliza o fim do arquivo (eof ). A função gets retorna zero quando atinge eof, quebrando o loop. A contagem final é impressa na tela.

Mas aqui está o truque. Você não precisou editar o código para contar caracteres em um arquivo. Você acabou de adicionar uma pequena instrução ao shell.

Redirecionando entrada e saída

Se você compilou este programa em um executável chamado xxx, poderá alimentá-lo com um arquivo.

O colchete angular redireciona o conteúdo de filename para stdin. O programa pensa que está lendo o teclado. Não é. Está lendo do disco.

Você também pode usar tubos. Isso passa a saída de um comando diretamente para outro.

Este é o mesmo resultado. cat despeja o arquivo na saída padrão. O pipe envia para o seu programa.

Você também pode redirecionar a saída. Em vez de ver a contagem na tela, você pode salvá-la.

Agora xxxfilename e grava o resultado em um novo arquivo de texto chamado out. Isso é poderoso. Ele permite encadear ferramentas sem escrever código extra para lidar com ponteiros de arquivo.

Quando os streams não são suficientes

Às vezes, o redirecionamento não é suficiente. Talvez você precise abrir vários arquivos de uma vez. Talvez você esteja construindo um editor de texto que salve arquivos de configuração. Talvez você precise verificar se chegou ao final de um arquivo sem travar.

Nestes casos, você precisa de funções diretas de arquivo. Eles também estão em stdio, mas operam em ponteiros de arquivo em vez de fluxos padrão.

  • fopen : Abre um arquivo para leitura ou gravação.
  • fclose : Fecha o arquivo quando terminar.
  • feof : Verifica se você atingiu o final do arquivo.
  • fprintf : Grava dados formatados em um arquivo específico.
  • fscanf : Lê dados formatados de um arquivo específico.
  • fputs : Grava uma string em um arquivo.
  • fgets : Lê uma linha de um arquivo.
  • fputc : Grava um caractere em um arquivo.
  • fgetc : Lê um caractere de um arquivo.

Essas funções oferecem mais controle. Você pode gerenciar vários fluxos ao mesmo tempo. Você pode decidir exatamente qual arquivo obtém quais dados.

Qual caminho você segue? A simplicidade do redirecionamento stdin ou o controle de ponteiros diretos de arquivo? Depende do que você está construindo. Para scripts rápidos, o redirecionamento é fundamental. Para aplicações complexas, você precisará das funções de arquivo.

Não existe uma resposta perfeita. Apenas compensações.