int ungetc (int caractere, FILE * fluxo);
Insere o caractere de volta ao fluxo de entrada apontado por fluxo.
Esse caractere será retornado na próxima chamada de leitura ao fluxo. Caso a função fflush ou funções que alterem o posicionamento do fluxo (fseek, fsetpos ou rewind) sejam chamadas antes da próxima operação de leitura, o caractere inserido é descartado.o caractere presente na posição atual do fluxo interno. Após a leitura, a posição atual é avançada para o próximo caractere.
Algumas implementações suportam que essa função seja chamada múltiplas vezes. Entretanto, esta funcionalidade não é portável; o padrão C garante que apenas uma chamada (por vez) desta função obtenha sucesso. Não é necessário que a implementação da biblioteca padrão suporte múltiplas chamadas de ungetc para ser conformante.
Em caso de sucesso, a função ungetc limpa o indicador de EOF do fluxo. Esta função afeta apenas operações de leitura no fluxo, não alterando o fluxo "físico" (como, por exemplo, arquivos).
Caso seja passado EOF como argumento no caractere, a função falha e o fluxo não é modificado. Não é necessário que o caractere passado seja o último lido – qualquer caractere é válido.
c - O caractere que deverá ser inserido de volta ao fluxo. Este valor é convertido internamente para um unsigned char antes de ser colocado de volta.
fluxo - Ponteiro para um objeto FILE que será utilizado como fluxo de entrada.
Em caso de sucesso, a função retorna o caractere que foi jogado de volta ao fluxo. O valor é retornado como um unsigned char convertido para um int.
Em caso de falha, a função retorna EOF.
O programa a seguir lê o conteúdo do arquivo.txt e o imprime na tela, substituindo, na impressão, todos os espaços por uma nova linha.
#include <stdio.h>
int main() {
FILE* arquivo = fopen("arquivo.txt", "r");
if(arquivo == NULL) {
fprintf(stderr, "Erro ao abrir o arquivo.txt.");
return 1;
}
int caractere = getc(arquivo);
while(caractere != EOF)
if(caractere == ' ') {
/* substitui todo espaço por uma nova linha */
ungetc('\n', arquivo);
} else {
ungetc(caractere, arquivo);
}
putchar(getchar(arquivo));
caractere = getc(arquivo);
}
fclose(arquivo);
return 0;
}
getc função
putc função