d라이브러리









C언어강좌 ⑤ 단순한 언어, 다양한 응용

지난호까지 C언어의 수식 표현과 연산자의 활용과 같은 기본적인 사항에서 부터 제어구조, 함수의 정의에 이르기까지 다양한 내용을 살펴보았다. 이번 강좌에서는 C언어가 표준적으로 갖고 있는 함수 라이브러리를 설명하여 파일의 입출력에 관련된 사용법도 다루어 보겠다.

C언어에서는 파일 처리에 여러 기능을 활용할 수 있도록 OS(운영체계)나 C컴파일러를 라이브러리 형태로 제공하고 있으며 이를 효율적으로 활용할 수 있도록 독자여러분들은 예제를 통해 경험해주기 바란다.

C언어의 입·출력함수

C언어의 최대장점은 단순한 언어라는 것인데 프로그래밍 언어가 단순해질수록 그 유용성은 다양해진다. 사실 C언어는 다른 언어에 비해 내장 함수가 빈약하지만 라이브러리 형태로 제공되는 함수로 모든 기능이 지원된다. 때문에 C언어가 제공하는 라이브러리의 기능은 파스칼(Pascal)이나 베이직언어에서 만끽할 수 없었던 다양한 응용성을 갖고 있다.

C컴파일러와 함께 공급되는 함수라이브러리의 기능이 증대되면 C언어의 능력 또한 증대되지만 때로는 역기능을 초래할 수도 있다.

역기능 중에서 대표적인 것은 C로 작성된 프로그램의 이식성을 저하시키는 점이다. 이러한 것을 제거하려면 C함수 라이브러리를 표준화시켜야 한다. 일반적으로 유닉스(Unix)용 C에서는 어느정도 라이브러리의 통일이 이루어져 있지만 마이크로 컴퓨터용 C 컴파일러에 따라오는 라이브러리에 대해서는 그 통일이 어렵다.

그러나 이중에서도 Microsoft C는 Unix C와 많은 라이브러리가 공통적으로 되어 있어서 C언어 사용자에게 널리 이용되고 있다. 터보(Turbo) C는 C언어의 사용자에게 많은 기능을 제공해주어 프로그램 개발에 편리하지만 이식성에서는 좀 무리가 있다고 보아야 할 것이다.

이와같은 문제가 있기 때문에 모든 C언어에 관한 패키지들은 표준 입출력 라이브러리를 제공하고 있으며 대부분의 C 라이브러리에서 이를 이용하고 있다.

표준함수의 라이브러리

C언어가 공통적으로 처리가능한 표준 함수들에 대해 설명해보자.

표준 입출력 함수
①getchar : 한 문자를 입력한다
②putchar : 한 문자를 출력한다
③gets : 문자열을 입력하고 맨뒤에 널(Null)문자를 붙인다
④puts : 문자열을 출력하고 리턴(Return) 문자를 출력한다
⑤scanf : 정해진 양식에 따라 데이타를 입력한다.
⑥printf : 정해진 양식에 따라 데이타를 출력한다.

문자열 처리 함수
①strcat : 두개의 문자열을 결합시킨다.
②strcmp : 두개의 문자열을 비교한다.
③strcpy : 문자열을 복사한다.
④strlen : 문자열의 문자개수를 구한다.

파일 입출력 함수
①fopen : 사용하려는 파일을 오픈한다. (오픈의 형태는 읽기, 쓰기, 첨가가 있다)
②fclose : 사용하고 있는 파일을 닫는다.
③getc : 파일에서 문자 한개를 읽는다.
④putc : 파일에 문자 한개를 써넣는다.
⑤fgetc : getc와 같은 기능을 한다.
⑥fputc : putc와 같은 기능을 한다.
⑦fgets : 파일에서 리턴문자를 만날때까지의 문자열을 읽는다.
⑧fputs : 파일에 문자열을 써 넣는다. (마지막 널 문자는 리턴으로 바뀐다)
⑨fscanf : 파일의 데이타를 지정된 양식에 따라 읽는다.
⑩fprintf : 파일로 데이타를 지정된 양식에따라 써넣는다.
⑪fseek : 파일내에서 특정 위치에 있는 문자를 읽기 위해 파일 포인터를 이동시킨다.

데이타 변환 함수
①atoi : 문자에 해당하는 정수값을 구해준다(문자숫자를 실제 값으로 변환한다).
②tolower : 대문자를 소문자로 변환한다.
③toupper : 소문자를 대문자로 변환한다.

문자분류 함수
①isalpha : 알파벳 문자인지를 판정한다.
②isdigit : 숫자문자인지를 판정한다.
③islower : 소문자인지를 판정한다.
④isupper : 대문자인지를 판정한다.
⑤isspace : 빈칸(blank)인지를 판정한다.

기타함수
①malloc : 프로그램이 필요로 하는 메모리를 할당하고 메모리의 시작주소를 구해준다.
②free : 할당메모리를 다시 시스팀 메모리로 돌려준다.

헤더(header) 파일의 사용

C언어로 작성된 프로그램을 보면 첫문장이
# include
# include
와 같이 작성된 경우가 많다. 이렇듯 초보자에게는 아주 생소한 사용법을 배워야 한다는 어려움이 있을지 모르겠으나 파일의 개념과 함수의 사용법을 이해하고 있다면 큰 문제는 없으리라 생각한다.

그렇다면 과연 stdio.h라는 내용은 어떻게 되어 있는가? stdio.h 파일에 기록되는 내용은 파일의 마지막 문자로 사용되는 EOF(End Of File)의 값 지정, 널 포인터 상수인 NULL을 정의한다.

C언어에서는 EOF의 값으로 -1을 사용하게 되는데 이를 위한 정의문이 stdio.h에 들어가 있는 것이다.

즉 # define EOF -1로 정의되어 있다. 그러나 컴파일러에 따라 이러한 정의를 stdio.h에 기억시키지 않는 경우가 있는데 이럴때는 자신의 프로그램 내에서 이를 정의해야 할 것이다.

stdio.h에는 또다른 정의가 포함될수 있으며 대표적인 것으로 표준 입출력 함수에 관한 정의를 생각할 수 있다.

먼저 FILE 데이타 형에 대한 구조정의가 있다. 파일을 오픈할때 오픈된 파일의 내용을 읽어들일 메모리 버퍼의 주소, 파일에 주어지는 고유 번호, 현재 읽어내려는 문자 위치에 관한 정보를 기억할 곳이 필요한 데 이러한 목적을 위해 사용된다.

다음으로 매크로 정의가 있다. getchar나 putchar를 이러한 매크로 기능을 이용하여 getc나 putc로 정의할 수 있다.

stdio.h 파일의 사용이 얼마동안 다소 불편할지 모르겠으나 습관적으로 프로그램을 작성할 때 써주면 좋을 것이다.

헤더 파일 stdio.h와 함께 문자처리에 사용되는 또하나의 헤더 파일은 ctype.h이다. ctype.h 파일에는 다음과 같은 문자처리용 매크로가 정의되어 있다. 여기서 매크로라는 용어는 컴파일러가 컴파일을 하기전에 문자열을 미리 치환할 수 있는 기능을 뜻한다.


헤더파일의 사용


ctype.h 헤더 파일에는 또다른 많은 매크로 정의를 가질 수 있다.

파일의 입출력

C언어에서의 파일취급은 사용하는 시스팀에 따라 다른 경우가 많다. 본 강좌에서는 순차파일의 입출력에 대해서만 다루어본다.
 

(프로그램1) 파일 입력


일단 화일을 사용하려면 # include 를 사용하여 파일의 구조체를 정의해야 한다. stdio.h 헤더 파일에는 구조체 정의문이 들어 있어 자기가 작성하려는 프로그램에서 일부러 정의할 필요가 없게 되어 있다.

다음에는 FILE *P, *fopen( ); 을 사용하여 포인터 p와 fopen이라는 함수가 가리키고 있는 것이 FILE이라는 데이타형이라는 것을 나타내준다. fopen함수는 파일의 이름과 파일의 사용방식을 지정해주는 함수이다. 또한 p는 포인터로 사용하는 파일을 가리킨다.

p=fopen ("파일이름", "파일사용방식"); 여기서 p의 값은 자동적으로 만들어지므로 프로그램작성자는 상관할 필요가 없다. 파일이름은 사용자가 자유로 만들어 낼 수 있으며 파일사용방식은 사용방법에 따라 3가지중에서 하나를 선택한다.

 

파일 사용방식의 3가지


이 외에도 C 컴파일러에 따라 몇가지 사용방식이 더 추가될 수도 있다. 즉

FILE *fps, *fopen( );

fps=fopen("LETTER", "r");로 해놓으면 LETTER 파일을 "읽어내기" 방식으로 선택하여 놓고 c=getc(fps);문으로 파일에서 문자 하나씩 입력하게 되는 것이다.

(프로그램1)과 (프로그램2)는 각각 파일의 입력·출력 예를 간단히 보인 것이다.
 

(프로그램2) 파일 출력


C언어에서의 파일 입출력에 관한 예제를 위해 다음의 문자열이 기억되어 있는 파일이 있다고 가정하자. 파일의 이름은 LETTER라 하자.
 

LETTER파일


(프로그램3)
"LETTER" 파일의 문자를 모두 대문자로 바꿔 "LETTER1"에 출력하도록 프로그램을 변경하라. 단, 함수 islower는 cty-pe.h 파일에 정의되어진 것으로 한다.
 

프로그램


프로그램
 

(프로그램4)
"LETTER" 파일의 공백문자 및 제어문자를 제거하고 "LETTER1"에 출력하도록 프로그램을 변경하라.
 

프로그램4


(프로그램5)
"LETTER" 파일 속에서 'a', 'e', 'i', 'o', 'u'의 문자수를 각각 구하는 프로그램을 작성하라.
 

프로그램 5

 

프로그램 5


(프로그램6)
"LETTER" 파일 속에서의 'a' 또는 'A', 'e' 또는 'E', 'i' 또는 'I', 'o' 또는 'O', 'u' 또는 'U'를 세는 프로그램을 작성하라.
 

프로그램 6


(프로그램7)
"LETTER" 파일 속에서의 문자수와 행수를 세는 프로그램을 작성하라.
 

프로그램 7


(프로그램8)
C언어로 작성된 원시프로그램에서 {,}, (,), [,]의 문자수를 각각 세고, 그 결과로부터 각 문자쌍이 올바르게 사용되어 있는지를 확인하는 프로그램을 작성하라. 단, 문자열에 포함된 이들 문자의 처리는 생각하지 않는 것으로 한다.
 

프로그램 8
 

이 기사의 내용이 궁금하신가요?

기사 전문을 보시려면500(500원)이 필요합니다.

1988년 02월 과학동아 정보

  • 조동섭 교수

🎓️ 진로 추천

  • 컴퓨터공학
  • 소프트웨어공학
  • 정보·통신공학
이 기사를 읽은 분이 본
다른 인기기사는?