19
Chapter 16 유도 자료형 struct, union, enum 1 2009 한국항공대학교 항공우주기계공학부 (http://mercury.kau.ac.kr/sjkwon) Perfect C 구조체 (struct) 구조체 (struct) 구조체의 필요성 책에 대한 정보를 살펴보면 책에 대한 정보를 살펴보면 매우 다양 책 정보 struct 다른 형의 변수들을 제목, 저자, 출판사, 페이지수, 가격, ISBN 다른 형의 변수들을 묶어서 만든 하나의 새로운 자료형을 구조체(struct) 구조체는 연관된 멤버로 구조체는 연관된 멤버로 구성되는 통합 자료형으로 대표적인 유도자료형 구조체 정의 구조체 정의 중괄호 사이에 원하는 여러 개의 변수를 선언 중괄호 다음 마지막에 2 중괄호 다음 마지막에 세미콜론(;)을 반드시 기술

struct, union, enummercury.hau.ac.kr/sjkwon/Lecture/cprogram/C... · 2012. 7. 5. · Perfect C 구조체정의와변수선언 구조체정의 구조체멤버(구성요소, member)

  • Upload
    others

  • View
    6

  • Download
    0

Embed Size (px)

Citation preview

Page 1: struct, union, enummercury.hau.ac.kr/sjkwon/Lecture/cprogram/C... · 2012. 7. 5. · Perfect C 구조체정의와변수선언 구조체정의 구조체멤버(구성요소, member)

Chapter 16

유도 자료형

struct, union, enum

1

2009 한국항공대학교항공우주기계공학부(http://mercury.kau.ac.kr/sjkwon)

Perfect C

구조체 (struct)구조체 (struct)구조체의 필요성

책에 대한 정보를 살펴보면책에 대한 정보를 살펴보면매우 다양

책 정보

struct서 다른 자 형의 변수들을

제목, 저자, 출판사, 페이지수, 가격, ISBN 등

서로 다른 자료형의 변수들을묶어서 만든 하나의 새로운자료형을 구조체(struct)구조체는 연관된 멤버로구조체는 연관된 멤버로구성되는 통합 자료형으로대표적인 유도자료형

구조체 정의구조체 정의중괄호 사이에 원하는 여러개의 변수를 선언중괄호 다음 마지막에

2

중괄호 다음 마지막에세미콜론(;)을 반드시 기술

Page 2: struct, union, enummercury.hau.ac.kr/sjkwon/Lecture/cprogram/C... · 2012. 7. 5. · Perfect C 구조체정의와변수선언 구조체정의 구조체멤버(구성요소, member)

Perfect C

구조체 정의와 변수 선언구조체 정의와 변수 선언구조체 정의

구조체 멤버(구성요소 member)구조체 멤버(구성요소, member)• 구조체 정의 구문에서는 각 구성요소의 초기값을 대입할 수 없음• 한 구조체 내부에서 선언되는 구조체 멤버의 이름은 모두 유일

구조체의 정의는 구조체 struct book을 새로운 자료형으로 정의하는 구문• 구조체 정의는 구조체 변수를 선언하는 구문이 아님

변수 선언구조체 정의 구문은 변수의 범위와 비슷

구조체 정의 구문의 위치에 따라 구조체 선언시 자료형 이용의 범위가 정해짐• 구조체 정의 구문의 위치에 따라 구조체 선언시 자료형 이용의 범위가 정해짐

3

Perfect C

구조체 정의와 변수 선언구조체 정의와 변수 선언구조체 변수를 선언하는 다른 방법은 다음과 같이 구조체 정의와 변수선언을 함께하는 방법선언을 함께하는 방법

위 구문에서 변수 yourbook과 mybook은 모두 같은 구조체 struct book자료형위 구조체 정의 구문에서 구조체 태그 이름 book을 생략해도 구조체 변수선언이 가

4

선언이 가능

Page 3: struct, union, enummercury.hau.ac.kr/sjkwon/Lecture/cprogram/C... · 2012. 7. 5. · Perfect C 구조체정의와변수선언 구조체정의 구조체멤버(구성요소, member)

Perfect C

자료형이 다른 구조체자료형이 다른 구조체다음 구문에서 구조체 변수 mybook과 yourbook은 자료형이 다른변수변수

• 즉 동일한 구조체 태그 이름으로 선언된 변수만이 동일한 자료형의구조체가 됨

• 자료형이 다르면 대입연산자를 사용 불가능

가능한 구조체의 표준형을 사용할 것!

5

가능한 구조체의 표준형을 사용할 것!

Perfect C

typedef를 이용한 형 선언typedef를 이용한 형 선언

typedef를 이용한 형 선언struct book {

char title[50]; //제목h h [50] //저자구조체 struct book이 정의된

상태에서 구조체 struct book 좀 더 간단하게 선언

char author[50]; //저자char publish[50]; //출판사int pages; //페이지수int price; //가격

}좀 더 간단하게 선언

typedef로 구조체 정의구조체 정의 자체를 typedef와

};

typedef struct book book ;…b k b k

구 체 정의 자체를 yp 와함께하는 방법아래 typedef 구문에서 새로운자료형으로 정의되는 키워드는

book yourbook; book mybook;

자료형으로 정의되는 키워드는software로서,

• 이 구문 이후에는 구조체를선언할 때 ft 를선언할 때 software를이용하여 형의 선언이 가능

6

Page 4: struct, union, enummercury.hau.ac.kr/sjkwon/Lecture/cprogram/C... · 2012. 7. 5. · Perfect C 구조체정의와변수선언 구조체정의 구조체멤버(구성요소, member)

Perfect C

구조체 멤버 변수의 초기값 지정구조체 멤버 변수의 초기값 지정구조체 struct book 정의

구조체 정의에서는 구조체 멤버에 초기 값을 지정 불가능

struct book { …

구조체정의에서멤버의초기값을

int pages = 200; int price = 30000;

};typedef struct book book;

멤버의초기값을저장하는것은허용되지않는다.

구조체 변수 mybook를 선언할 때 초기값을 대입구조체 변수도 배열과 같이 중괄호를 이용하여 초기값을 대입

typedef struct book book;

구조체 변수도 배열과 같이 중괄호를 이용하여 초기값을 대입

멤버 참조

book mybook = {"[email protected]", "강 환수", "학술정보", 530, 20000};

멤버 참조구조체 멤버를 접근하기 위해서는 멤버 접근 연산자인 마침표(.)를 이용

구조체변수 구조체멤버

7

구조체변수.구조체멤버mybook.author

Perfect C

예제 소스예제 소스

structbook.c구조체 정의, 변수 선언, 구조체 이용구조체 이용프로그램

8

Page 5: struct, union, enummercury.hau.ac.kr/sjkwon/Lecture/cprogram/C... · 2012. 7. 5. · Perfect C 구조체정의와변수선언 구조체정의 구조체멤버(구성요소, member)

Perfect C

복소수 구조체복소수 구조체

복소수를 표현하는 구조체 complex를 정의복소수는 a+bi로 표현되며, 실수부 a와 허수부 b는 실수 값구조체 struct complex는 다음과 같이 정의

struct complex {double real; //실수double img; //허수double img; //허수

};typedef struct complex complex;

9

Perfect C

구조체 주의구조체 주의메인 함수 상단 전역부분에서 t t부분에서 structcomplex를 정의

메인 함수 내부에서다시 같은 이름으로struct complex를정의하면서 변수comp를 하나 선언

comp = comp3;와같은 대입문은 에러같은 대입문은 에러

두 변수 comp1과comp2는 다시complex 유형으로complex 유형으로선언

10

Page 6: struct, union, enummercury.hau.ac.kr/sjkwon/Lecture/cprogram/C... · 2012. 7. 5. · Perfect C 구조체정의와변수선언 구조체정의 구조체멤버(구성요소, member)

Perfect C

구조체 포인터구조체 포인터구조체 변수를 가리키는 주소 값을 저장하려면 구조체 포인터 변수를이용이용

struct univ {char title[50]; //이름char address[50]; //주소int students; //학생수

};

변수 k 는 구 체 변수이 변수 은 구 체를 가리키는 인터

struct univ ku = {"한국대학교", "서울시 서초구", 5000};struct univ *ptr = &ku;

변수 ku는 구조체 변수이고, 변수 ptr은 구조체를 가리키는 포인터

11

Perfect C

구조체 포인터 이용구조체 포인터 이용연산자 ->

구조체 포인터 변수 ptr을 이용하여 구조체의 멤버를 참조하려면 연산자->를 이용

• 연산자 ->는 구조체 멤버 참조 연산자로서 연산자 우선순위가 가장 높음

간접 연산자 *

printf("학교 : %s, 주소 : %s, 학생수 : %d\n", ptr->title, ptr->address, ptr->students);

간접 연산자 *변수 ptr을 이용하여 구조체의 멤버 member를 참조하는 다른 방법은(*ptr).member를 이용하는 방법

위 구문에서 (* ) i l 은 * i l 과는 다른 의미이 반 시 괄호를

printf("학교 : %s, 주소 : %s, 학생수 : %d\n", (*ptr).title, (*ptr).address, (*ptr).students);

위 구문에서 (*ptr).title은 *ptr.title과는 다른 의미이므로 반드시 괄호를사용*ptr.title은 *(ptr.title)을 의미하므로 ptr이 포인터 변수이면 에러가 발생

구조체의 멤버를 참조하는 연산자 와 의 연산자 우선순위가 가장 높기 때문

12

• 구조체의 멤버를 참조하는 연산자 ->와 .의 연산자 우선순위가 가장 높기 때문

Page 7: struct, union, enummercury.hau.ac.kr/sjkwon/Lecture/cprogram/C... · 2012. 7. 5. · Perfect C 구조체정의와변수선언 구조체정의 구조체멤버(구성요소, member)

Perfect C

포인터 변수포인터 변수

구조체 변수 및 포인터 변수를 이용하는 다음 4가지구문을 잘 구별하도록

13

Perfect C

구조체 배열구조체 배열구조체 변수를 여러 개 선언하기 위해서 구조체 배열을 이용

구조체 b k으로 배열 l [3]을 선언하여 구조체 원소 3개를 선언하는 구문• 구조체 book으로 배열 clang[3]을 선언하여 구조체 원소 3개를 선언하는 구문

struct book {char author[50];char title[50];char title[50];int pages;

};

struct book clang[3] = { {"Deitel", "C How To Program", 600},

{"Al Kelly", "A Book On C", 700},{"Stephen Prata" "C Primer Plus" 800} };

다른 배열과 같이 구조체 배열도 첨자를 이용하여 각 원소를 참조하며, 첨자는 0부터 (배열크기-1)까지 가능

{ Stephen Prata , C Primer Plus , 800} };

• 첫 구조체 원소의 멤버를 출력하는 구문

printf("저자 : %s 제목 : %s 페이지수 : %d₩n"

14

printf( 저자 : %s, 제목 : %s, 페이지수 : %d₩n , clang[0].author, clang[0].title, clang[0].pages);

Page 8: struct, union, enummercury.hau.ac.kr/sjkwon/Lecture/cprogram/C... · 2012. 7. 5. · Perfect C 구조체정의와변수선언 구조체정의 구조체멤버(구성요소, member)

Perfect C함수에서의 구조체:

구조체 인자, 값 전달(call by value)

복소수 연산에 이용되는 함수를 구현복소수 연산에 이용되는 함수를 구현함수 paircomplex1()는 전달 인자 복소수의 켤레 복소수를 구하여 반환하는 함수

• 그러므로 변수 pcomp에는 {3.4, -4.8}이 저장

complex comp = {3.4, 4.8};complex pcomp;pcomp = paircomplex1(comp);

구현 complex paircomplex1( complex com ){

com img = -com img;

위와 같이 구조체는 함수의 전달 인자와 반환 값으로 이용이 가능

com.img com.img;return com;

}

위와 같이 구조체는 함수의 전달 인자와 반환 값으로 이용이 가능위 함수는 구조체 인자를 값에 의한 호출(call by value) 방식으로 이용즉 함수 paircomplex1() 내부에서 지역 구조체 변수 com을 하나 만들어 실인자의구조체 값을 모두 복사하는 방식으로 구조체 값을 전달

15

Perfect C 함수에서의 구조체:체 ( )구조체 인자, 주소 전달(call by address)

인자를 call by address로인자를 call by address로이전 함수를 주소에 의한 호출(call by address) 방식으로 변환다음 함수 paircomplex2()는 인자를 주소값으로 저장하여, 실인자의 변수

의 값을 직접 정하 방식comp의 값을 직접 수정하는 방식

void paircomplex2(complex *com){

위 함수를 호출하기 위해서는 comp의 주소값을 이용해야 하므로 다음과

com->img = -com->img;}

위 함수를 출하기 위해서는 p의 주 값을 이용해야 하 다음과같이 호출

paircomplex2( &comp )

구조체가 많은 멤버를 가지거나, 큰 배열을 멤버로 가지는 경우, 구조체자체를 인자로 전달하는 것은 매우 비효율이러한 경우는 주소값으로 전달하는 방식인 주소에 의한 호출 방식이

16

효율적임.

Page 9: struct, union, enummercury.hau.ac.kr/sjkwon/Lecture/cprogram/C... · 2012. 7. 5. · Perfect C 구조체정의와변수선언 구조체정의 구조체멤버(구성요소, member)

Perfect C

예제 소스

complexfunction.c

예제 소스

함수 paircomplex1()과paircomplex2()를 구하는프로그램프로그램

17

Perfect C

공용체 (union)공용체 (union) 정의

공용체는 서로 다른 자료형을 동일한 저장 공간에 이용하는 자료형공용체는 서로 다른 자료형을 동일한 저장 공간에 이용하는 자료형

공용체 union data를 정의하는 구문구조체 정의에서 키워드 struct를 union으로 사용한 것과 비슷구 체 정의에서 키워 를 사용한 것과 비슷

union data {char ch;int cnt;

공용체의 멤버는 모든 멤버가 동일한 저장 공간을 사용하므로 동시에

int cnt;double real;

};

공용체의 멤버는 모든 멤버가 동일한 저장 공간을 사용하므로 동시에여러 멤버의 값을 저장하여 이용할 수 없으며, 마지막에 저장한 하나의멤버의 자료값만을 저장공용체 union data 정의와 함께 변수 data1과 포인터 변수 pdata를공용체 union data 정의와 함께 변수 data1과 포인터 변수 pdata를선언하는 구문

union data {char ch;

18

int cnt;double real;

} data1, *pdata ;

Page 10: struct, union, enummercury.hau.ac.kr/sjkwon/Lecture/cprogram/C... · 2012. 7. 5. · Perfect C 구조체정의와변수선언 구조체정의 구조체멤버(구성요소, member)

Perfect C

공용체 메모리 내부공용체 메모리 내부

메모리공용체 union data 자료형의 변수 data1은

• 멤버의 유형이 char, int, double이므로• 멤버 중 가장 큰 크기인 double 형의 8바이트를 공용체의• 멤버 중 가장 큰 크기인 double 형의 8바이트를 공용체의

저장공간으로 확보하여 세 개의 멤버가 함께 이용

union dataunion data {

char ch;int cnt;

동일한 저장장소를 함께 이용

double real;} data1, *pdata ;

동일한 저장장소를 함께 이용멤버가 char인 경우는 8바이트 중에서 첫 1바이트만 이용하고,int인 경우는 전체 공간의 첫 4바이트만 이용하며,

19

double인 경우는 8바이트 공간을 모두 사용

Perfect C

공용체 이용공용체 이용구조체와 같이 typedef를 이용하여 새로운 자료형으로 정의 가능

공용체의 초기값은 첫 멤버의 초기값으로만 저장이 가능하고다른 동일한 변수의 값으로 초기화 가능

typedef union data uniondata;

• 다른 동일한 변수의 값으로 초기화 가능

//uniondata data1 = {10}; //에러 발생

uniondata data2 = {'A'}; //첫 멤버인 char 유형으로만 초기화 가능i d d 3 d 2 //다른 변수로 초기화 가능

공용체 변수로 멤버를 접근하기 위해서는• 구조체와 같이 접근 연산자 ‘.’을 이용하며, 포인터인 경우는 연산자 ‘->’를

이용

uniondata data3 = data2; //다른 변수로 초기화 가능

이용

pdata = &data2; printf("%2c %2c₩n", pdata->ch, (*pdata).ch);printf("%2c %2c₩n" data2 ch data3 ch);

공용체 변수 data1의 멤버 ch에 문자 ‘a’를 저장하는 구문• 이 문장 이후에 멤버 cnt나 real을 출력하는 것은 의미가 없음

printf( %2c %2c₩n , data2.ch, data3.ch);

d t 1 h ' '

20

data1.ch = 'a';

printf("%c, %d, %6.2f\n", data1.ch, data1.cnt, data1.real);

Page 11: struct, union, enummercury.hau.ac.kr/sjkwon/Lecture/cprogram/C... · 2012. 7. 5. · Perfect C 구조체정의와변수선언 구조체정의 구조체멤버(구성요소, member)

Perfect C

열거형 enum (skip!)열거형 enum (skip!)키워드 enum을 이용하여 열거형을 정의

열거형 구문은 관련 있는 정수형 상수 목록 집합을 정의하는 구문

enum color {yellow, red, blue, magenta, green} col;

위 문장은 변수 col을 열거형 enum color로 선언하는 구문열거형 enum color는 색상을 나타내는 5개의 상수 yellow, red, blue,magenta, green을 표현하는 의미magenta, green을 표현하는 의미color는 열거형 태그이름으로 다음과 같이 생략 가능

enum {yellow, red, blue, magenta, green} col;

정수 상수에 대응5개의 상수 yellow, red, blue, magenta, green은

{y , , , g , g } ;

y g g• 각각 0에서부터 4까지의 정수 상수에 대응

정수 상수는 변수 col에 대입할 수 있고, 상수 0에 해당하는 값을 표현

21

col = yellow;

Perfect C

열거형 이용(skip!)열거형 이용(skip!)enum day7을 정의하고,

• typedef를 이용하여 새로이 열거형 자료형 day를 정의하는 구문typedef를 이용하여 새로이 열거형 자료형 day를 정의하는 구문

새로운 자료형 d 는 d 7로 변수 선언에 다음과 같이 이용할 수 있고

enum day7 {sun, mon, tue, wed, thu, fri, sat};typedef enum day7 day;

새로운 자료형 day는 enum day7로 변수 선언에 다음과 같이 이용할 수 있고,변수를 선언하면서 초기 값으로 상수 fri를 대입하는 문장

day today = fri;

열거형 day는 7개의 상수 sun, mon, tue, wed, thu, fri, sat를 가지며, 각각0에서부터 6까지의 정수 상수에 대응열거형 enum pl 정의에서는 필요한 경우, 상수값을 각 상수에 지정 가능

enum pl {c=1972, cpp=1983, java=1995, cs=2000};typedef enum pl plang;

다음은 circle 상수는 0, tri는 3, rect는 4, star는 7, dia는 8로 정의• 즉 상수 값을 지정한 상수는 그 값으로, 지정되지 않은 상수는 그 이후로 1씩 증가한 상수

값으로 정의

22

enum shape {circle, tri=3, rect=4, star=7, dia};typedef enum shape shape;

Page 12: struct, union, enummercury.hau.ac.kr/sjkwon/Lecture/cprogram/C... · 2012. 7. 5. · Perfect C 구조체정의와변수선언 구조체정의 구조체멤버(구성요소, member)

Perfect C

프로그래밍 실습프로그래밍 실습프로그램 목적

이 장에서 배운 구조체와 열거형을 이용하여 카드 게임을 할 수 있는여러 자료형을 만들어보고, n명에게 7장의 카드를 나눠주는 프로그램을작성

카드 게임카 드 는 52 장 이 고 , 모 양 은 4 가 지 hearts, diamonds, clubs,spades이며 번호는 ace(1)부터 10까지 그리고 jack(11) queen(12)spades이며, 번호는 ace(1)부터 10까지 그리고 jack(11), queen(12),king(13)의 종류

출력

23

Perfect C

구현구현프로그램에 필요한 구조체 정의나 열거형 정의는 모두 파일 card.h 헤더파일에 코딩헤더파일에 코딩

파일 card.c에는 다음 함수 네 개를 구현

int main()(){

card deck[52];…

return 0;}}

void filldeck(card *deck) //모든 카드에 모양과 번호를 부여{

…}}

void shuffle(card *deck) //카드를 섞는 과정{

…}

void deal(card *deck, int cnt) //cnt에게 7장을 나누어 줌{

24

…}

Page 13: struct, union, enummercury.hau.ac.kr/sjkwon/Lecture/cprogram/C... · 2012. 7. 5. · Perfect C 구조체정의와변수선언 구조체정의 구조체멤버(구성요소, member)

Perfect C

헤더 파일 card h헤더 파일 card.h카드의 모양과 번호를 열거형 enumsuit와 enumface로 정의하고, 구조체 card의 멤버로 번호와 모양을 저장하는 suit face를 정의구조체 card의 멤버로 번호와 모양을 저장하는 suit, face를 정의

구조체 자료형 card를 typedef를 이용하여 정의

문자열 배열은 번호나 모양의 출력을 위하여 전역 변수로 선언

함수 세 개의 함수원형

25

Perfect C

메인 함수메인 함수메인 함수에서는 카드의 수만큼 배열 deck[52]를 선언하여 이배열을 함수 filld k() h ffl () d l()의 인자로 이용배열을 함수 filldeck(), shuffle(), deal()의 인자로 이용

card deck[52];int cnt = 2;int cnt = 2;

filldeck(deck);shuffle(deck);shuffle(deck);printf("카드 게임에 몇 사람이 참가합니까? >> ");scanf("%d", &cnt);printf("\n");p ( \ );deal(deck, cnt);

return 0;

26

Page 14: struct, union, enummercury.hau.ac.kr/sjkwon/Lecture/cprogram/C... · 2012. 7. 5. · Perfect C 구조체정의와변수선언 구조체정의 구조체멤버(구성요소, member)

Perfect C

함수 deal()함수 deal()함수 deal()의 두번째 인자는 게임에 참가하는 인원수로표준입력으로 받은 값을 실인자로 호출표준입력으로 받은 값을 실인자로 호출

void deal(card *deck, int cnt){ {

…for ( i = 0; i < total; i++ )

printf( "%5s of %-8s%c", strface[deck[i].face], strsuit[deck[i].suit], (i+1) % cnt ? ' ' : '\n');

출력될 문자열은 문자 포인터 배열 t f [13]과 t it[4]에

[ [ ] ], ( ) \ );}

출력될 문자열은 문자 포인터 배열 strface[13]과 strsuit[4]에정의

카드 deck[i]에는 멤버인 face와 suit가 있으며, 이 값은 카드[ ] ,모양의 열거형 정수 상수 값으로 정의되어 있으므로 출력될문자열로 strface[deck[i].face]와 strsuit[deck[i].suit]를이용하면 쉽게 원하는 문자열 출력 가능

27

이용하면 쉽게 원하는 문자열 출력 가능

Perfect C

28

Page 15: struct, union, enummercury.hau.ac.kr/sjkwon/Lecture/cprogram/C... · 2012. 7. 5. · Perfect C 구조체정의와변수선언 구조체정의 구조체멤버(구성요소, member)

Chapter 17

파일 처리파일 처리

29

2009 한국항공대학교항공우주기계공학부(http://mercury.kau.ac.kr/sjkwon)

Perfect C

함수 fopen()함수 fopen()파일을 만들어 데이터를 입출력하기 위해서는 함수 fopen()을 이용함수 fopen()의 함수 원형은 다음과 같으며 헤더 파일 stdio h 파일에 정의함수 fopen()의 함수 원형은 다음과 같으며 헤더 파일 stdio.h 파일에 정의

struct _iobuf {char *_ptr;int _cnt;char *_base;int _flag;int _file;int _charbuf;int _bufsiz;char *_tmpfname;

};typedef struct _iobuf FILE;

30

함수 fopen()은 두 개의 문자열 전달인자를 이용, 반환값은 포인터 값인FILE *

Page 16: struct, union, enummercury.hau.ac.kr/sjkwon/Lecture/cprogram/C... · 2012. 7. 5. · Perfect C 구조체정의와변수선언 구조체정의 구조체멤버(구성요소, member)

Perfect C

파일 열기파일 열기함수 fopen()에서 첫 번째 문자열은 처리하려는 파일 이름이고, 두번째 문자열은 파일 처리 종류(모드)번째 문자열은 파일 처리 종류(모드)다음 소스는 파일 “basic.txt”을 여는 모듈로서, 파일에 자료를 쓰기위해 파일을 열므로 모드 값을 “w”로 기술

FILE *f; char fname[] = "basic.txt";if ( (f = fopen(fname, "w") ) == NULL) {

i tf( "파일이 열리지 않습니다 \ " )

FILE *fr, *fw; int a; double b;fr = fopen(“1.dat, “r") //입력 파일 열기f f (“2 t " ") //출력파일열기printf( "파일이 열리지 않습니다.\n" );

};

fclose(f);

fw = fopen(“2.out, "w") //출력파일열기

fscanf(fr, %d, %lf, &a, &b); //입력 데이터 읽기fprintf(fw, %d, %lf, a, b); //출력데이터쓰기

조건문 if를 위와 같이 함수 fopen()과 함께 이용하면 파일 열기에실패할 경우 문장 "파일이 열리지 않습니다.\n"을 출력파일 처리가 모두 끝났으면 파일 포인터 f를 인자로 함수 f l (f)를파일 처리가 모두 끝났으면 파일 포인터 f를 인자로 함수 fclose(f)를호출하여 반드시 파일을 닫도록함수 fopen()의 두 번째 인자는 파일 처리 종류(모드)

31

• “r”, “w”, “a”, “r+”, “w+”, “a+”의 종류

Perfect C

파일 처리 모드파일 처리 모드

파일 처리 모드 종류 의미

32

Page 17: struct, union, enummercury.hau.ac.kr/sjkwon/Lecture/cprogram/C... · 2012. 7. 5. · Perfect C 구조체정의와변수선언 구조체정의 구조체멤버(구성요소, member)

Perfect C

함수 fprint fscanf함수 fprint, fscanf파일에 자료를 쓰거나 읽기 위하여 함수 fprintf()와 fscanf()를 이용

• 이 함수를 이용하기 위해서는 헤더 파일 stdio h 파일을 포함• 이 함수를 이용하기 위해서는 헤더 파일 stdio.h 파일을 포함

함수 fprintf()와 fscanf()의 함수 원형

int fprintf(FILE *, const char *, ...);

위 함수의 첫 번째 인자는 입출력에 이용될 파일이고, 두 번째 인자는 입출력되는문자열이며 다음 인자들은 입출력될 변수 목록

int fscanf(FILE *, const char *, ...);

문자열이며, 다음 인자들은 입출력될 변수 목록• 함수 원형에서 기호 …은 여러 인자가 계속됨을 의미

함수 fprintf()와 fscanf()를 표준 입출력에도 이용 가능 (But, 되도록 표준 입출력은printf()와 scanf를 사용할 것!)p ()와 를 사용할 것 )

• 즉 함수 fprintf()와 fscanf()의 첫 번째 인자에 각각 stdin 또는 stdout를 이용하면 표준입력, 표준 출력으로 이용이 가능

기호 상수 stdin, stdout은 stderr과 함께 헤더 파일 stdio.h에 정의되어 있는 값으로각각 표준입력 표준출력 표준에러를 의미각각 표준입력, 표준출력, 표준에러를 의미

#define stdin (&_iob[0])#define stdout (& iob[1])

표준 파일 키워드 장치(device)

표준입력 stdin 키보드

33

#define stdout (&_iob[1])#define stderr (&_iob[2])

표준출력 stdout 모니터 화면

표준에러 stderr 모니터 화면

Perfect C

함수 fgets()와 fputs()함수 fgets()와 fputs()

함수 fgets()와 fputs()파일에 문자열을 입출력하는 함수로 fgets()와 fputs()

• 이 함수도 헤더파일 stdio.h 파일에 다음과 같은 함수원형으로 정의

함수 fgets()는 문자열을 개행문자(\n)까지 읽어 개행문자도 함께 입력함수 g ()는 문자열을 개행문자( )까지 읽어 개행문자 함께 입력문자열에 저장마찬가지로 함수 fputs()는 문자열을 그대로 출력

함수 fgets() 인자함수 fgets() 인자첫 번째 인자는 문자열이 저장될 문자 포인터이고, 두 번째 인자는 입력할 문자의 최대 수이며, 세 번째 인자는 입력 문자열이 저장될 파일

함수 fputs() 인자첫 번째 인자는 출력될 문자열이 저장된 문자 포인터이고첫 번째 인자는 출력될 문자열이 저장된 문자 포인터이고, 두 번째 인자는 문자열이 출력되는 파일

h * f t ( h * i t FILE *)

34

char * fgets(char *, int, FILE *);int fputs(char *, FILE *);

Page 18: struct, union, enummercury.hau.ac.kr/sjkwon/Lecture/cprogram/C... · 2012. 7. 5. · Perfect C 구조체정의와변수선언 구조체정의 구조체멤버(구성요소, member)

Perfect C

함수 fgetc()와 fputc()함수 fgetc()와 fputc()문자 하나를 파일에 입출력하는 함수로 fgetc()와 fputc()를 제공

• 이 함수의 원형은 헤더파일 stdio h에 정의• 이 함수의 원형은 헤더파일 stdio.h에 정의이 함수들은 문자 하나의 입출력의 대상인 파일 포인터를 인자로 이용

int fgetc(FILE *);

이 함수와 같은 함수로 getc()와 putc()도 이용 가능

int fputc(int, FILE *);

int getc(FILE *);int putc(int, FILE *);

문자의 표준 입출력에 이용되는 getchar()와 putchar()는 다음과 같이함수 getc()와 putc()를 이용한 매크로

#define getchar() getc(stdin)

함수 fgetc()와 fputc()는 getc()와 putc()와 그 기능은 동일하며, fgetc()와

#define getchar() getc(stdin)#define putchar(_c) putc((_c),stdout)

35

g p g p gfputc()는 함수이고, getc()와 putc()는 매크로

Perfect C

함수 feof()와 ferror(): skip!함수 feof()와 ferror(): skip!

함수 feof()파일의 내부 포인터 위치가 파일의 끝(EOF)인지를 검사하는데 필요한 함수파일의 내부 포인터 위치가 파일의 끝(EOF)인지를 검사하는데 필요한 함수

• 이 함수는 헤더파일 stdio.h에 다음 함수 원형으로 정의

int feof(FILE *);

파일의 위치가 파일의 마지막(end of file)인지를 검사하여, 파일의 마지막이면 0이아닌 값을, 파일의 마지막이 아니면 0을 반환

• 그러므로 표준입력에서 계속적으로 입력을 받는 구문으로 다음을 이용 가능

while (!feof(stdin)) {…

}

함수 ferror()파일 처리에서 오류가 발생했는지 검사하는 함수

• 함수의 원형은 헤더파일 stdio.h에 정의함수의 원형은 헤더파일 에 정의

이전 파일 처리에서 오류가 발생하면 0이 아닌 값을 발생하고, 오류가 발생하지않으면 0을 반환

int ferror(FILE *);

36

않으면 0을 반환

Page 19: struct, union, enummercury.hau.ac.kr/sjkwon/Lecture/cprogram/C... · 2012. 7. 5. · Perfect C 구조체정의와변수선언 구조체정의 구조체멤버(구성요소, member)

Perfect C

예제 소스목적 예제 소스목적“list filename”을 입력

• 파일 filename의내용을 표준출력으로출력하는 프로그램

조건명령어 줄 인자를 활용, 두 번째 인자가두 번째 인자가파일이름에 해당이 파일이름에해당하는 인자를해당하는 인자를기술하지 않으면간단한 사용법을알리고 프로그램은종료파일 내용의 출력은 한줄마다 맨 앞에 줄번호를 출력번호를 출력첫 실행에서는파일이름을 입력하지않았고 두 번째에는 이

37

않았고, 두 번째에는 이프로그램의 소스를파일이름으로 기술 1

Perfect C

17 4절 이후 skip!17.4절 이후 skip!

17장 숙제는 17.3 절까지의 중간점검 문제

38