#include <stdio.h> int fgetc(FILE *stream); char *fgets(char *s, int size, FILE *stream); int getc(FILE *stream); int getchar(void); char *gets(char *s); int ungetc(int c, FILE *stream);
getc()는 stream을 여러 번 검사하는 매크로 함수로 구현되어 있다는 점을 제외하고는 fgetc()와 동일하다.
getchar()는 getc(stdin)와 동일하다. 즉 표준 입력을 통해서 문자를 입력 받는다.
gets()는 표준 입력(stdin)으로부터 개행 문자나 EOF로 끝나는 한 줄을 입력 받아서 s가 가리키는 버퍼에 저장하고 마지막을 '\0'로 변경한다. 그러나 버퍼 오버플로우에 대한 검사를 하지 않는다. (이 점에 대해서는 아래의 버그를 보기 바란다.)
fgets()는 최대 size - 1 개 이하의 문자를 stream으로부터 읽어서 s가 가리키는 버퍼에 저장한다. 그러나 EOF나 개행 문자를 입력 받았을 경우에는 읽기를 멈춘다. 입력 받은 개행 문자는 그대로 버퍼에 저장하고 '\0'을 버퍼의 마지막 문자 다음에 추가한다.
ungetc()는 c를 unsigned char로 변환한 다음, 읽기 명령에 의해 다시 읽어들일 수 있도록 stream에 푸쉬한다. 푸쉬한다 - 라는 말은 문자가 지정한 위치에 명령의 역순으로 저장된다는 말이다; 즉 단 한 문자의 푸쉬만을 보장할 수 있다.
여기에서 설명한 함수는 서로 섞어서 호출할 수도 있고, 같은 종류의 입력 스트림에 대한 stdio 라이브러리의 함수와 섞어서 호출할 수도 있다.
gets()와 fgets()는 성공했을 경우 문자열의 포인터 s를 반환한다. 그리고 에러가 발생하거나 파일의 마지막에 도달한 경우, 또한 아무런 문자도 입력 받지 못한 경우에는 NULL을 반환한다.
ungetc()는 성공했을 때는 c를 반환하고 에러가 발생했을 경우에는 EOF를 반환한다.
여기에서 설명한 함수의 입력 스트림을 stdio 라이브러리의 로우-레벨 시스템 콜인 read()의 파일 디스크립터와 공유해서 사용하는 것은 결코 좋은 방법이 아니다. 그 결과가 정의되어 있지 않아서 의도하지 않은 방향으로 동작할 가능성이 크기 때문이다.