본문 바로가기

C언어/C언어 문법

[C언어] 파일 입출력 함수 (fputc, fputs, fgetc, fgets, putchar, getchar, puts, gets)

728x90
반응형

문자 입출력 함수 (putchar, getchar)

 

putchar 함수와 getchar 함수의 경우 문자를 입출력하는 함수이다.

 

 

함수의 반환형과 요구하는 매개변수의 자료형은 아래와 같다.

 

int getchar(void);
int putchar(int c);

 

 

putchar 의 인자로 출력할 문자를 전달해 주면 된다.

 

 

 

따라서 입출력함수는 아래 코드처럼 사용이 가능하다.

 

#include <stdio.h>

int main()
{
    int ch;
    ch = getchar();
    putchar(ch);
    return 0;
}

 

 

 

 

 

 

 

 

 

 

 

 

문자열 입출력 함수 (puts, gets)

 

문자열 입출력 함수는 문자 하나만이 아니라 문자열 자체를 입출력할 수 있다.

 

함수의 반환형과 요구하는 매개변수의 자료형은 아래와 같다.

 

 

char* gets(char* s);
char* puts(const char* s);

 

 

 

따라서 아래 코드처럼 사용이 가능하다.

 

 

#include <stdio.h>

int main()
{
    char str[7];
    gets(str);
    puts(str);
    puts(str);
    return 0;
}

 

 

또한 puts 함수는 문자열 출력이 끝난 후 자동으로 개행이 이루어진다.

 

str을 두 번 출력해 보는 것으로 이를 확인할 수 있을 것이다.

 

 

그런데 위 코드처럼 작성할 경우 할당된 메모리보다 큰 데이터가 들어오더라도 그대로 실행이 된다.

이것 때문에 메모리 공간을 침범하여 실행 중 오류가 발생할 수도 있다.

 

따라서 가급적이면 fgets 함수를 호출하는 것이 좋다.

 

 

 

위 4개의 함수들은 printf, scanf 함수의 하위호환이라고 볼 수 있다.

 

그래도 사용하는 이유는 기능이 훨씬 적은 대신 더 적은 계산비용으로 빠른 속도를 낼 수 있기 때문이다.

 

 

 

 

 

 

 

 

파일 입출력 함수 (fputc, fgetc, fputs, fgets)

 

파일 입출력함수도 문자만을 입출력받을 수 있는 함수와 문자열을 입출력받을 수 있는 함수로 나뉘어진다.

 

fputc, fgetc는 문자를 입출력하는 함수이며

fputs, fgets는 문자열을 입출력하는 함수이다.

 

위 네 개의 함수의 반환형과 요구하는 매개변수는 아래와 같다.

 

int fputc(int c, FILE* stream);
int fgetc(FILE* stream);

int fputs(const char* s, FILE* stream);
char* fgets(char* s, int n, FILE* stream);

 

다른 것은 매개변수로 FILE* stream 이 하나 추가된 것 말고는 모두 위에서 설명한 입출력함수와 동일한데

fgets 함수의 경우에는 정수형 매개변수가 하나 더 추가되어 있다.

 

fgets 함수는 문자열의 주소와 스트림뿐만 아니라 문자열의 크기를 추가로 요구한다.

 

따라서 gets 함수를 사용할 때 발생할 수 있는 메모리 초과를 미리 막을 수 있다.

 

 

 

 

파일 입출력 함수의 경우에는 매개변수로 stream을 요구한다.

 

이 stream에는 전송할 스트림을 전달하여 원하는 스트림을 지정할 수 있다.

 

이때 표준 입출력 스트림을 전달하면 putchar 등과 같은 표준입출력함수와 같은 기능을 할 것이다.

 

 

putchar(ch1);
fputc(ch2, stdout);

 

ch1 = getchar();
ch2 = fgetc(stdin);

 

puts(str1);
fputs(str2, stdout);

 

gets(str1);
fgets(str2, sizeof(str2), stdin);

 

 

따라서 위 코드들은 서로 같은 의미를 지닌다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

fgets 함수의 잘못된 사용

 

#include <stdio.h>

int main()
{
    char str[7];
    int i;
    
    for (i=0;i<3;i++)
    {
    	fgets(str, sizeof(str), stdin);
    	printf("Read %d: %s \n", i+1, str);
    }
    return 0;
}

 

 

 

 

위 코드를 통해서 문자열을 입력받을 때 메모리를 초과하여 입력했다고 해보자.

 

 

그럴 경우에 str에 들어가고 남은 데이터는 소멸하지 않고 그대로 유지되며 다음 문자열 입력 시에 들어가게 된다.

위와 같은 현상이 발생하는 이유는 다음 포스팅에서 작성할 '버퍼'의 개념 때문이다.

 

* 문자가 6개씩 출력되는 이유는 마지막에 널 문자의 자리를 비워놔야 하기 때문이다.

 

 

 

 

그렇다면 이것은 다음으로 제쳐두고 I like you라는 세 단어를 입력해 보겠다.

 

 

 

 

위와 같이 개행이 두 번씩 일어난 것을 확인할 수 있다.

 

i를 입력하고 난 후 엔터까지 문자열로 인식하여 'i\n'가 출력되고 printf 함수 안의 \n 가 또 출력된 것이다.

 

 

지금 나타난 문제들의 해결방법이나 원인은 다음 포스팅에서 '버퍼'를 설명할 때 한 번에 설명하겠다.

 

 

 

 

 

 

 

 

 

 

 

728x90
반응형