5주차: c 심화학습 구조체와파일입출력 · c++ 프로그래밍실습 5주차: c...

27
C++ 프로그래밍 실습 5주차 : C 심화학습 구조체와 파일입출력

Upload: others

Post on 05-Aug-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 5주차: C 심화학습 구조체와파일입출력 · c++ 프로그래밍실습 5주차: c 심화학습– 구조체와파일입출력

C++ 프로그래밍 실습

5주차 : C 심화학습 – 구조체와 파일입출력

Page 2: 5주차: C 심화학습 구조체와파일입출력 · c++ 프로그래밍실습 5주차: c 심화학습– 구조체와파일입출력

C++ Programming

typedef 키워드

• 새로운 타입 정의 (typedef)– 데이터 타입을 필요에 따라 다른 이름으로 정의

– 사용형태

• typedef [데이터형] [새롭게 정의한 데이터형];

– 사용 예

• typedef int INTEGER;

• typedef int * PINT;

– 프로그램에서 사용되는 데이터 유형을 보다 독립적으로 유지할수 있는 장점을 가진다.

Page 3: 5주차: C 심화학습 구조체와파일입출력 · c++ 프로그래밍실습 5주차: c 심화학습– 구조체와파일입출력

C++ Programming

typedef 키워드 예제 (typedef.c)

• typedef 사용 예#include <stdio.h> //타입 정의typedef int VALUE_TYPE;//함수 원형VALUE_TYPE sum(VALUE_TYPE x, VALUE_TYPE y); int main(){

VALUE_TYPE x,y, result; x = 298, y=57; result = sum(x,y); printf("result = %d₩n",result); return 0;

} VALUE_TYPE sum(VALUE_TYPE x, VALUE_TYPE y){

VALUE_TYPE data; data = x + y; return data;

}

Page 4: 5주차: C 심화학습 구조체와파일입출력 · c++ 프로그래밍실습 5주차: c 심화학습– 구조체와파일입출력

C++ Programming

구조체

• 구조체의 개념(struct)– 관련된 데이터 타입을 복합하여 하나의 새로운 타입으로 정의

– 데이터 조합을 통한 의미 있는 데이터 정의

– 일반적으로 레코드 형태를 가진다.

– 구조체 형식• struct [구조체 이름]{

– [데이터 타입] [변수이름1];

– [데이터 타입] [변수이름1];

– [데이터 타입] [변수이름1];

– [데이터 타입] [변수이름1];

– ...

– [데이터 타입] [변수이름1];

• };

struct : 구조체 정의 키워드[구조체 이름] : 구조체의 대표명[데이터 타입] : 각 요소의 타입

[변수이름] : 각 구성요소의 이름

Page 5: 5주차: C 심화학습 구조체와파일입출력 · c++ 프로그래밍실습 5주차: c 심화학습– 구조체와파일입출력

C++ Programming

구조체

• 구조체 형태 선언 예– 학생에 대한 구조체 선언

학생 (student_type)

학번(int hakbun) 이름(char name[10]) 학과(char dept[20]) 나이(int age)

struct student_type{ int hakbun; //학번char name[10]; //이름char dept[20]; //학과int age; //나이

};

Page 6: 5주차: C 심화학습 구조체와파일입출력 · c++ 프로그래밍실습 5주차: c 심화학습– 구조체와파일입출력

C++ Programming

구조체

• 구조체 변수 선언– 구조체 변수 선언

• 구조체 선언은 새로운 데이터 형의 선언하는 것으로 이 새로운 형의 구조체 타입을 사용하기 위해서는 구조체 변수 선언이 요구된다.

– 구조체 변수 선언 방법

변수 선언 방법 예제와 설명

예> struct{...;} x, y; // 구조체 변수 x와 y

struct{....

} [변수명1],[변수명2], ...;구조체명이 생략된 형태로 구조체 선언과 동시에 변수들을 선언한다.

예> struct stype{...;

} x, y; // 구조체 변수 x, ystruct stype z; 구조체 변수 z

struct [구조체명]{...

} [변수명1],[변수명2], ...;

struct [구조체명] [변수명3], ...;

구조체 명을 가지고 있으며 구조체 선언과 동시에 변수들을 선언하고 있으며, 선언이후 이 구조체 이름을 통해 필요한 구조체변수를 선언할 수 있다.

예> typedef struct{...;

} CARD; // 새로운 데이터 타입CARD x,y; // 구조체 변수 x, y

typedef struct{...

} [데이터 타입];

[데이터 타입] [변수명1],[변수명2]...;

typedef 문에 의해 구조체를 새로운 데이터 타입으로 정의하고 이 정의된 타입을 이용해 변수들을 선언하고 있다.

Page 7: 5주차: C 심화학습 구조체와파일입출력 · c++ 프로그래밍실습 5주차: c 심화학습– 구조체와파일입출력

C++ Programming

구조체

• 학생 구조체 변수와 메모리 관계– 구조체의 크기는 전체 구성요소의 크기이다.

Page 8: 5주차: C 심화학습 구조체와파일입출력 · c++ 프로그래밍실습 5주차: c 심화학습– 구조체와파일입출력

C++ Programming

구조체

• 구조체 변수의 초기화– 일반변수나 배열 변수처럼 static이나 extern 구조체 변수는 선

언과 동시에 초기화 될 수 있다.

– 초기화 예• static STUDENT x = { 101, "Kim","Computer Science","20" };

• 초기 값의 구분은 쉼표(,)로 구분

• 순서대로 각 요소의 값 지정

• 정적 변수는 초기화 하지 않을 경우 디폴트 초기값을 가진다.– 숫자 : 0

– 문자 : '₩0'

Page 9: 5주차: C 심화학습 구조체와파일입출력 · c++ 프로그래밍실습 5주차: c 심화학습– 구조체와파일입출력

C++ Programming

구조체

• 구조체 변수의 사용

– 배열 요소의 접근은 첨자를 통해 이루어짐

– 구조체 변수의 각 요소의 접근은 어떻게 이루어지는가?

• 구조체 요소 접근 연산자 : "."

• [구조체 변수이름].[요소 이름]

– 사용예

• x.hackbun = 100101;

• strcpy(x.name,"w y kim");

• strcpy(x.dept,"computer science");

• x.age = 20;

Page 10: 5주차: C 심화학습 구조체와파일입출력 · c++ 프로그래밍실습 5주차: c 심화학습– 구조체와파일입출력

C++ Programming

구조체 예제 (struct.c)

• 구조체와 구조체 변수 선언 그리고 사용 예#include <stdio.h> #include <string.h> //strcpy 사용//구조체 타입 선언typedef struct{

int hakbun; //학번char name[10]; //이름char dept[20]; //학과int age; //나이

}STUDENT; int main(){

// 구조체 변수 선언static STUDENT one ={ 101, "홍길동", "컴퓨터전공", 20}; static STUDENT two ={ 201, "이철수", "미디어통신전공",21}; //one 학생 출력printf("번호 : %d, 이름 : %s , 학과 : %s , 나이 %d ₩n",

one.hakbun , one.name , one.dept , one.age); //two 학생 수정two.hakbun = 301; strcpy(two.dept,"정보통신학과"); //two 학생 출력printf("번호 : %d, 이름 : %s , 학과 : %s , 나이 %d ₩n",

two.hakbun , two.name , two.dept , two.age);return 0;

}

출력 결과 :

번호 : 101, 이름 : 홍길동, 학과 : 컴퓨터전공, 나이 20

번호 : 201, 이름 : 이철수, 학과 : 미디어통신전공, 나이 21

Page 11: 5주차: C 심화학습 구조체와파일입출력 · c++ 프로그래밍실습 5주차: c 심화학습– 구조체와파일입출력

C++ Programming

구조체• 구조체와 포인터

– 구조체에 대한 포인터를 사용할 경우 다음과 같은 두 가지 방법으로 접근이 가능하다.

– Ex) struct student{

int hakbun;

char name[20];

char dept[20];

int age;

};

struct student s1 = {101, “홍길동”, “컴퓨터전공”, 20};

struct student s2 = {201, “이철수”, “미디어통신전공”, 21};

struct student *s3, *s4;

s3 = &s1; s4=&s2;

– 첫번째 : Dereference 연산자 사용(*)• Int hakbun = (*s3).hakbun;

– 두번째 : -> 연산자 사용• Int hakbun = s4->hakbun;

Page 12: 5주차: C 심화학습 구조체와파일입출력 · c++ 프로그래밍실습 5주차: c 심화학습– 구조체와파일입출력

C++ Programming

스트림과 파일 그리고 표준 입출력

• 스트림(Stream)과 파일(File)

– 스트림(Stream)

• 컴퓨터와 연결된 여러 주변장치와의 논리적인 흐름

• 주변장치와 연결하는 접속 채널의 개념

• 컴퓨터와 주변장치의 정보전달은 스트림을 통해 이루어짐

• 모든 정보는 스트림을 통해 전달

– 파일

• C언어에서 파일은 모든 주변 장치를 포함한다. (Unix, Linux에 해당)

– 디스크에 저장된 파일

– 디스플레이 화면

– 키보드

– 프린터

– 직/병렬 포트

– 테이프 등등…

Page 13: 5주차: C 심화학습 구조체와파일입출력 · c++ 프로그래밍실습 5주차: c 심화학습– 구조체와파일입출력

C++ Programming

스트림과 파일 그리고 표준 입출력

• 스트림과 파일

– 스트림과 파일의 관계

• 스트림은 파일을 연결하기 위한 논리적인 접근 통로

• 오픈된 스트림을 통해 정보를 전달하거나 받아들임

• 스트림 사용을 위해서는 항상 오픈(Open) 되어야하고 사용 후 닫아(Close) 주어야 한다.

– C언어에서 제공되는 표준 입/출력 장치

• 키보드 : 표준 입력 장치

• 디스플레이 화면 : 표준 출력 장치

– 표준 스트림

• 표준 입/출력 장치의 연결을 위해 사용되는 스트림

• C 프로그램 시작시 자동적으로 오픈되어 사용 가능하다.

• 종류

– stdin : 표준 입력 스트림 (키보트와 연결된 스트림)

– stdout : 표준 출력 스트림 (디스플레이 화면과 연결된 스트림)

– stderr : 표준 에러 스트림 (디스플리이 화면과 연결된 스트림)

Page 14: 5주차: C 심화학습 구조체와파일입출력 · c++ 프로그래밍실습 5주차: c 심화학습– 구조체와파일입출력

C++ Programming

스트림과 파일 그리고 표준 입출력

• 표준 입출력 함수

– 표준 입/출력 스트림을 이용하는 함수

– 표준 입/출력 함수 정의 헤더 파일

• stdio.h

– 표준 입출력 함수의 종류• 형식이 있는 입출력 함수 – printf(), scanf()

• 단일 문자 입출력 함수 – getchar(), putchar()

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

• 버퍼형 입출력 함수 – sscanf(), sprintf()

Page 15: 5주차: C 심화학습 구조체와파일입출력 · c++ 프로그래밍실습 5주차: c 심화학습– 구조체와파일입출력

C++ Programming

스트림과 파일 그리고 표준 입출력

• 단일 문자 입출력 함수– 단일 문자 입력 함수 – getchar()

• 함수의 원형– int getchar()

• 키보드로 부터 하나의 문자를 입력 받는다.• 리턴 결과

– 정상적 수행 : 해당 문자에 대한 ASCII 코드 값– 비정상적 수행 : EOF 값 반환

– 단일 문자 출력 함수 – putchar()• 함수의 원형

– int putchar(int ch)

• 화면에 ch에 해당되는 문자를 출력• 리턴 결과

– 정상적 수행 : 입력된 값이 반환– 비정상적 수행 : EOF 값 반환

Page 16: 5주차: C 심화학습 구조체와파일입출력 · c++ 프로그래밍실습 5주차: c 심화학습– 구조체와파일입출력

C++ Programming

예제 (getchar.c)

• 단일 문자 입/출력 함수 사용 예#include <stdio.h>

int main(){

char ch;

printf("한문자 입력 :");

ch = getchar(); // 한 문자 입력

printf("입력받은 결과 출력 : ");

putchar(ch); // 입력받은 문자 출력

putchar('₩n'); // 특수 문자 출력

return 0;

}

– 출력 결과 : _______________입력된문자출력

Page 17: 5주차: C 심화학습 구조체와파일입출력 · c++ 프로그래밍실습 5주차: c 심화학습– 구조체와파일입출력

C++ Programming

스트림과 파일 그리고 표준 입출력

• 문자열 입출력 함수

– 문자열 입력함수 – gets()

• 함수의 원형

– char *gets(char *str);

• 키보드로 부터 입력된 문자열 값을 저장

• *str : 입력된 문자열 저장 주소

• 입력된 문자열은 키보드로부터 <Enter>키를 누른 위치까지 포함

• 공백문자도 문자열에 포함됨

• <Enter>값은 자동적으로 '₩0'(NULL) 값으로 변경되어 저장됨

• 반환 결과

– 정상적일 경우 : 저장된 문자열의 주소

– 비정상적일 경우 : NULL 값

Page 18: 5주차: C 심화학습 구조체와파일입출력 · c++ 프로그래밍실습 5주차: c 심화학습– 구조체와파일입출력

C++ Programming

스트림과 파일 그리고 표준 입출력

• 문자열 입출력 함수

– 문자열 출력함수 – puts()

• 함수의 원형

– int puts(char *str);

• 입력된 문자열(*str)을 화면에 출력

• 출력시 '₩0' 값은 '₩n'(Enter) 값으로 변형되어 출력

• 반환 결과

– 정상적일 경우 : 음이 아닌 값

– 에러 발생 시 : NULL 값 반환

Page 19: 5주차: C 심화학습 구조체와파일입출력 · c++ 프로그래밍실습 5주차: c 심화학습– 구조체와파일입출력

C++ Programming

예제 (gets.c)

• 문자열 입출력 함수 사용 예#include <stdio.h>

int main(){ char buffer[80], *bp; printf("문자열 입력 : "); bp = gets(buffer); // 문자열 입력if(bp != NULL){ // 정상적인 입력 시

puts("입력된 문자열"); puts(bp); // 포인터를 통한 출력puts(buffer); // 배열을 통한 출력

}return 0;

}

Page 20: 5주차: C 심화학습 구조체와파일입출력 · c++ 프로그래밍실습 5주차: c 심화학습– 구조체와파일입출력

C++ Programming

파일 입출력

• 파일 입출력은 기본적으로 스트림을 이용하여 수행된다.– File pointer : FILE *fp

• stdio.h

Page 21: 5주차: C 심화학습 구조체와파일입출력 · c++ 프로그래밍실습 5주차: c 심화학습– 구조체와파일입출력

C++ Programming

파일 열기

• FILE *fopen(const char *filename, const char *mode)– filename : 열고자 하는 파일 이름

• 참고 : Unix나 Linux에서는 주변 장치를 모두 파일로 인식하고 파일을 다루는 인터페이스를 이용하여 접근할 수 있다.

– mode : 열기, 쓰기(덮어쓰기), 이어쓰기 등이 있다.

• “r” : 읽기

• “w” : 쓰기

• “a” : 이어쓰기

• 그 외의 모드는 강의자료 참고

– 반환 : 성공하였을 경우 해당 스트림의 포인터가 반환, 실패시 NULL 반환

Page 22: 5주차: C 심화학습 구조체와파일입출력 · c++ 프로그래밍실습 5주차: c 심화학습– 구조체와파일입출력

C++ Programming

파일 닫기

• int fclose(FILE *stream)– stream : 닫고자 하는 파일 스트림

Page 23: 5주차: C 심화학습 구조체와파일입출력 · c++ 프로그래밍실습 5주차: c 심화학습– 구조체와파일입출력

C++ Programming

파일의 끝을 체크하는 함수

• int feof(FILE *stream)– 반환 : 0 -> 파일의 끝 (EOF)

Page 24: 5주차: C 심화학습 구조체와파일입출력 · c++ 프로그래밍실습 5주차: c 심화학습– 구조체와파일입출력

C++ Programming

파일 입출력

• int fscanf(FILE *fp, const char *control_string, …);

– 파일로부터 control_string에 맞게 문자를 읽는다.

• int fprintf(FILE *fp, const char *control_string, …);

– 파일에 control_string에 따라 문자를 출력한다.

• char *fgets(char *str, int num, FILE *fp);– 최대 num만큼의 문자를 읽고 ‘₩0’ 또는 ‘₩n’을 만나면 읽

기를 중단한다.

• int fputs(char *str, FILE *fp);– str이 가리키는 문자열을 파일로 출력한다.

Page 25: 5주차: C 심화학습 구조체와파일입출력 · c++ 프로그래밍실습 5주차: c 심화학습– 구조체와파일입출력

C++ Programming

예제 (file.c)• 입력 파일 (file.in)

101Hong Gil DongMajor in Computer20

• 예제 파일#include <stdio.h>#include <stdlib.h>

int main(){int hakbun;char name[20];char major[20];int age;char temp[20];

FILE *fp;if((fp = fopen(“file.in”, “r”)) == NULL)

return 1;

fgets(temp, 20, fp); hakbun = atoi(temp); // 문자열을 정수로 변환 (“20” -> 20)fgets(name, 20, fp); // name = “Hong Gil Dong₩n”name[strlen(name) – 1] = ‘₩0’; // ‘₩n’ -> ‘₩0’ 으로 변환fgets(major, 20, fp); major[strlen(major) – 1] = ‘₩0’;fgets(temp, 20, fp); age = atoi(temp);printf(“No. : %d, Name : %s, Major : %s, Age : %d₩n”, hakbun, name, major, age);fclose(fp);return 0;

}

Page 26: 5주차: C 심화학습 구조체와파일입출력 · c++ 프로그래밍실습 5주차: c 심화학습– 구조체와파일입출력

C++ Programming

실습 (lab_5.c)

• 입력 파일을 다음과 같은 포맷으로 구성한다. (3~5명 정도의 정보를 입력. lab_5.in)101

홍길동

컴퓨터전공

90

201

이철수

미디어통신전공

100….

Page 27: 5주차: C 심화학습 구조체와파일입출력 · c++ 프로그래밍실습 5주차: c 심화학습– 구조체와파일입출력

C++ Programming

실습 (lab_5.c)

• lab_5.in 파일을 읽어 구조체 배열에 저장한다.

• 구조체 배열에 저장된 각 학생 정보를 화면에 출력한다.

• 전체 학생의 평균 성적을 구하고 화면에 출력한다.