쉽게 풀어쓴 C언어 Express 제18장 입출력과 라이브러리 함수 C Express.

Slides:



Advertisements
Similar presentations
제6장 조건문.
Advertisements

C 프로그래밍 기초.
프로그래밍1 및 실습 (C언어) - 3장 기본자료형 (3.6부터 끝까지) -
제12장 표준 입출력과 파일 입출력.
슬라이드 1~21까지는 각자 복습! 슬라이드 22부터는 수업시간에 복습
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express.
쉽게 풀어쓴 C언어 Express 제16장 파일 입출력 C Express.
쉽게 풀어쓴 C언어 Express 제16장 파일 입출력 C Express.
2014 ITA 8월 강의 C Programming -1주차- C언어 기초 정대진 ( )
-Part3- 제3장 콘솔 입출력과 파일 입출력.
C 프로그래밍 소개 숙명여대 창병모 2011 가을.
Chapter 10– 표준 함수(1) Outline 10.1 스트림과 파일 10.2 입출력 표준 함수
제3장 추가 실습 3장 관련 C 언어 프로그래밍 실습.
C 10장. 함수의 활용 #include <stdio.h> int main(void) { int num;
C 11장. 포인터의 활용 #include <stdio.h> int main(void) { int num;
쉽게 풀어쓴 C언어 Express 제4장 변수와 자료형 C Express.
컴퓨터의 기초 제 4강 - 표준 입출력, 함수의 기초 2006년 4월 10일.
쉽게 풀어쓴 C언어 Express 제3장 C프로그램 구성요소 C Express.
6장. printf와 scanf 함수에 대한 고찰
누구나 즐기는 C언어 콘서트 제4장 수식과 연산자.
쉽게 풀어쓴 C언어 Express 제16장 파일 입출력 C Express Slide 1 (of 23)
HW#1 Source 파일 제출 3.20(수)까지 제출 학번_이름_01.c
Chapter 13 문자 데이터와 문자열 문자 데이터 문자열.
8장 포인터.
연산자 대입 연산자 산술 연산자 관계 연산자 논리 연산자 비트 연산자 콤마 연산자 축약 연산자 sizeof 연산자
변수와 자료형.
10장 메모리 관리.
쉽게 풀어쓴 C언어 Express 제17장 동적 메모리와 연결 리스트 C Express.
쉽게 풀어쓴 C언어 Express 제17장 동적메모리와 연결리스트 C Express.
동적메모리와 연결리스트 컴퓨터시뮬레이션학과 2016년 봄학기 담당교수 : 이형원 E304호,
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 02. 프로그램의 기본구성.
C 7장. 배열과 문자열 #include <stdio.h> int main(void) { int num;
기초C언어 제3주 C프로그램 구성요소, 변수와 자료형 컴퓨터시뮬레이션학과 2016년 봄학기 담당교수 : 이형원
컴퓨터 프로그래밍 기초 - 2nd : scanf(), printf() 와 연산자 -
쉽게 풀어쓴 C언어 Express 제3장 C프로그램 구성요소 C Express.
제15장 전처리 및 비트연산.
21장. 문자와 문자열 처리 함수.
Part 04 입출력과 전처리 ©우균, 창병모 이 슬라이드는 부산대학교 우균이 작성하였습니다. 오류나 수정할 사항 있으면 연락 주세요.
내용 프로그래밍 언어(programming language) C 언어란?? C 언어 역사 C 언어 특징 C 프로그램의 구조
파일 기술자 복사 파일 기술자 복사 : dup(2) 파일 기술자 복사 : dup2(3)
12장 파일처리와 매크로 파일 입출력 함수 문자 입출력 함수 라인 입출력 함수 불록 입출력 함수 매크로.
Chapter 11 Strings.
10장 C 표준 파일 입출력 子曰 學而時習(실습?)之 不亦悅乎.
쉽게 풀어쓴 C언어 Express 제7장 반복문 C Express.
쉽게 풀어쓴 C언어 Express 제4장 변수와 자료형 C Express.
2장 표준 입출력 표준 입출력 함수의 종류 형식화된 입출력 문자 입출력 문자열 입출력.
제2장 데이터형과 표준 입출력문 문봉근.
2019년 2월 24일 오후 4시 59분 제2장 표준 입출력 함수
자전거를 배우려면 안장에 올라가 페달을 밟아라.
Formatted Input/Output
컴퓨터 프로그래밍 기초 - 4th : 수식과 연산자 -
쉽게 풀어쓴 C언어 Express 제15장 전처리 및 비트연산 C Express Slide 1 (of 29)
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
컴퓨터 프로그램 제2,3장 간단한 C 프로그램 김 문 기.
Chapter 05. 입출력 함수.
실습과제 1(조건문, ) 표준입력으로 수축기 혈압을 입력 받아 그에 따른 적당한 표현을 화면에 출력하는 프로그램을 if-else 문을 이용하여 작성.
누구나 즐기는 C언어 콘서트 제2장 기초 사항 IT응용시스템공학과 김형진 교수.
쉽게 풀어쓴 C언어 Express 제3장 C프로그램 구성요소 C Express Slide 1 (of 25)
쉽게 풀어쓴 C언어 Express 제6장 조건문 C Express Slide 1 (of 28)
쉽게 풀어쓴 C언어 Express 제6장 조건문 C Express.
개정판 누구나 즐기는 C언어 콘서트 제10장 문자열 출처: pixabay.
C 13장. 입출력 라이브러리 #include <stdio.h> int main(void) { int num;
C 4장. 연산자 #include <stdio.h> int main(void) { int num;
C.
printf("Global Korea\n");
개정판 누구나 즐기는 C언어 콘서트 제12장 파일 입출력 출처: pixabay.
배열, 포인터, 함수 Review & 과제 1, 2.
⊙ 입출력 처리란? data를 입력장치로부터 program 내부로 읽어 들이거나
Presentation transcript:

쉽게 풀어쓴 C언어 Express 제18장 입출력과 라이브러리 함수 C Express

스트림의 개념 스트림(stream): 입력과 출력을 바이트(byte)들의 흐름으로 생각하는 것

스트림과 파일 스트림은 구체적으로 FILE 구조체를 통하여 구현 FILE은 stdio.h에 정의되어 있다. struct _iobuf { char *_ptr; int _cnt; char *_base; int _flag; int _file; int _charbuf; int _bufsiz; char *_tmpfname; }; typedef struct _iobuf FILE;

표준 입출력 스트림 표준 입출력 스트림(standard input/output stream): 필수적인 몇 개의 스트림 이름 스트림 연결 장치 stdin 표준 입력 스트림 키보드 stdout 표준 출력 스트림 모니터의 화면 stderr 표준 에러 스트림 표준 입출력 스트림(standard input/output stream): 필수적인 몇 개의 스트림 프로그램 실행 시에 자동으로 만들어지고 프로그램 종료 시에 자동으로 없어진다. 스트림의 최대 개수는 512개 3개의 표준 입출력 스트림이 첫 부분을 차지 stdin은 표준 입력 스트림 stdout은 표준 출력 스트림 stderr은 에러를 따로 출력하기 위하여 만들어진 스트림

입출력 함수의 분류 사용하는 스트림에 따른 분류 표준 입출력 스트림을 사용하여 입출력을 하는 함수 스트림 형식 표준 스트림 일반 스트림 설명 형식이 없는 입출력(문자 형태) getchar() fgetc(FILE *f,...) 문자 입력 함수 putchar() fputc(FILE *f,...) 문자 출력 함수 gets() fgets(FILE *f,...) 문자열 입력 함수 puts() fputs(FILE *f,...) 문자열 출력 함수 형식이 있는 입출력(정수, 실수,..) printf() fprintf(FILE *f,...) 형식화된 출력 함수 scanf() fscanf(FILE *f,...) 형식화된 입력 함수 사용하는 스트림에 따른 분류 표준 입출력 스트림을 사용하여 입출력을 하는 함수 스트림을 구체적으로 명시해 주어야 하는 입출력 함수 데이터의 형식에 따른 분류 getchar()나 putchar()처럼 문자 형태의 데이터를 받아들이는 입출력 printf()나 scanf()처럼 구체적인 형식을 지정할 수 있는 입출력

printf()를 이용한 출력 형식 제어 문자열의 구조 % 기호 형식 제어 문자열의 시작 플래그(flag) int printf(char *format, ...); 형식 제어 문자열의 구조 % 기호 형식 제어 문자열의 시작 플래그(flag) 출력의 정렬과 부호 출력, 공백 문자 출력, 소수점, 8진수와 16진수 접두사 출력 필드폭(width)과 정밀도(precision) 데이터가 출력되는 필드의 크기 정밀도는 소수점 이하 자릿수의 개수가 된다. %[플래그] [필드폭] [.정밀도] [{h | l | L}] 형식

필드폭 필드폭(field width) 데이터가 출력되는 필드의 크기 #include <stdio.h> int main(void) { printf("%6d %6d\n", 1, -1); printf("%6d %6d\n", 12, -12); printf("%6d %6d\n", 123, -123); printf("%6d %6d\n", 1234, -1234); printf("%6d %6d\n", 12345, -12345); printf("%6d %6d\n", 123456, -123456); printf("%6d %6d\n", 1234567, -1234567); } 1 -1 12 -12 123 -123 1234 -1234 12345 -12345 123456 -123456 1234567 -1234567

정밀도 정밀도(precision) 정수인 경우, 출력할 숫자의 개수 실수인 경우, 소수점 이하의 자릿수의 개수 #include <stdio.h> int main(void) { printf("%.5d %.8d\n", 123, 123); printf("%.6f\n", 0.12345678); printf("%.6e\n", 0.12345678); printf("%.6g\n", 0.12345678); printf("%.6s\n", "Hello World !"); } 00123 00000123 0.123457 1.234568e-001 Hello

플래그 기호 의미 기본값 - 출력 필드에서 출력값을 왼쪽 정렬한다. 오른쪽 정렬된다. + 결과 값을 출력할 때 항상 +와 -의 부호를 붙인다. 음수일 때만 - 부호를 붙인다. 출력값 앞에 공백 문자 대신에 0으로 채운다. -와 0이 동시에 있으면 0은 무시된다. 만약 정수 출력의 경우, 정밀도가 지정되면 역시 0은 무시된다(예를 들어서 %08.5). 채우지 않는다. blank(‘ ’) 출력값 앞에 양수나 영인 경우에는 부호대신 공백을 출력한다. 음수일 때는 -가 붙여진다. + 플래그가 있으면 무시된다. 공백을 출력하지 않는다. # 8진수 출력 시에는 출력값 앞에 0을 붙이고 16진수 출력 시에는 0x를 붙인다. 붙이지 않는다.

예제 #include <stdio.h> int main(void) { printf("----------------------------------------------------\n"); printf("| 형식지정자 | 36인경우| -36인경우|\n"); printf("|%%15d |%15d |%15d |\n", 36, -36); printf("|%%-15d |%-15d |%-15d |\n", 36, -36); printf("|%%+15d |%+15d |%+15d |\n", 36, -36); printf("|%%015d |%015d |%015d |\n", 36, -36); printf("|%% 15d |% 15d |% 15d |\n", 36, -36); printf("|%%- 15d |%- 15d |%- 15d |\n", 36, -36); printf("|%%#x |%#x |%#x |\n", 36, -36); } -------------------------------------------------- | 형식지정자 | 36인 경우 | -36인 경우 | |%15d | 36 | -36 | |%-15d |36 |-36 | |%+15d | +36 | -36 | |%015d |000000000000036 |-00000000000036 | |% 15d | 36 | -36 | |%- 15d | 36 |-36 | |%#x |0x24 |0xffffffdc |

정수출력 형식 지정자 설명 출력예 %d 부호있는 10진수 형식으로 출력 255 %i %u 부호없는 10진수 형식으로 출력 %o 부호없는 8진수 형식으로 출력 377 %x 부호없는 16진수 형식으로 출력, 소문자로 표기 fe %X 부호없는 16진수 형식으로 출력, 대문자로 표기 FE ---------------------------------------------------- | 형식지정자| 36인경우 | -36인경우| | %d | 36 | -36 | | %i | 36 | -36 | | %hd | 36 | -36 | | %ld | 36 | -36 | | %o | 44 | 37777777734 | | %u | 36 | 4294967260 | | %x | 24 | ffffffdc | ---------------------------------------------------- | 형식지정자 | 36인 경우 | -36인 경우 | | %15d | 36 | -36 | | %015d | 000000000000036 | -00000000000036 | | % 15d | 36 | -36 | | % 015d | 00000000000036 | -00000000000036 | | %-15d | 36 | -36 | | %- 15d | 36 | -36 | | %15.4d | 0036 | -0036 | | %-15.4d | 0036 | -0036 |

실수출력 형식 지정자 의미 출력 예 %f 소수점 고정 표기 형식으로 출력 123.456 %e %g %e형식과 %f 형식 중 더 짧은 형식으로 출력 %G %E형식과 %f 형식 중 더 짧은 형식으로 출력 ---------------------------------------------------- | 형식지정자 | 23.567인 경우 | -23.567인 경우 | | %15.2f | 23.57 | -23.57 | | %015.2f | 000000000023.57 | -00000000023.57 | | % 15.2f | 23.57 | -23.57 | | %+15.4f | +23.5670 | -23.5670 | | % 015.2f | 00000000023.57 | -00000000023.57 | | %-15.2f | 23.57 | -23.57 | | %- 15.2f | 23.57 | -23.57 | | %-15.4f | 23.5670 | -23.5670 | ---------------------------------------------------- | 형식지정자 | 23.567인 경우 | -23.567인 경우 | | %15.2e | 2.36e+001 | -2.36e+001 | | %015.2e | 0000002.36e+001 | -000002.36e+001 | | % 15.2e | 2.36e+001 | -2.36e+001 | | %+15.4e | +2.3567e+001 | -2.3567e+001 | | % 015.2e | 000002.36e+001 | -000002.36e+001 | | %-15.2e | 2.36e+001 | -2.36e+001 | | %- 15.2e | 2.36e+001 | -2.36e+001 | | %-15.4e | 23.5670 | -2.3567e+001 |

문자와 문자열 출력 형식 지정자 의미 출력 예 %c 문자 출력 c %s 문자열 출력 Hello World! ---------------------------------------------------- | 형식지정자 | 'b'인 경우 | | %c | b | %15c | b | %015c | 00000000000000b | %-15c | b 제어 문자 의미 \a 벨소리(경고) \b 백스페이스 \n 새로운 라인(new line) \t 수평탭 \\ 백슬래시 \? 의문부호 \' 홑 따옴표 \f 폼피드(form feed) \" 이중 따옴표 \r 캐리지 리턴(carrage return) ---------------------------------------------------- | 형식지정자 | "abcdefg"인 경우 | %s | abcdefg | %15s | abcdefg | %15.3s | abc | %015s | 00000000abcdefg | %-15s | abcdefg

scanf()를 이용한 입력 문자열 형태의 입력을 사용자가 원하는 형식으로 변환한다.

scanf()의 기본 * 현재 입력을 무시하라는 의미 파일에서 하나의 특정한 열만 읽을 때 유용 필드폭 %[*] [필드폭] [{h | l | L}] 형식 * 현재 입력을 무시하라는 의미 파일에서 하나의 특정한 열만 읽을 때 유용 필드폭 필드폭 만큼의 문자를 읽어서 값으로 변환 공백 문자로 입력 값을 분리하지 않고서도 여러 개의 값들을 읽을 수 있다. 크기 지정 h가 정수형인 경우, short형으로 변환 h가 float형 앞에 붙으면 double형으로 변환 L은 long double형으로 변환

정수 입력 분류 형식 지정자 설명 정수형 %d 입력값을 int형으로 변환, 앞에 0이 붙으면 8진수로 가정, 앞에 0x가 붙으면 16진수로 가정한다. %u 부호없는 정수 형식으로 입력 %o 입력을 8진수로 가정하고 정수로 변환 %x 입력을 16진수로 가정하고 정수로 변환 #include <stdio.h> int main(void) { int d, o, x; scanf("%d %o %x", &d, &o, &x); printf("d=%d o=%d x=%d\n", d, o, x); return 0; } 10 d=10 o=8 x=16

실수 입력 분류 형식 지정자 설명 정수형 %d 입력값을 int형으로 변환, 앞에 0이 붙으면 8진수로 가정, 앞에 0x가 붙으면 16진수로 가정한다. %u 부호없는 정수 형식으로 입력 %o 입력을 8진수로 가정하고 정수로 변환 %x 입력을 16진수로 가정하고 정수로 변환 #include <stdio.h> int main(void) { int d, o, x; scanf("%d %o %x", &d, &o, &x); printf("d=%d o=%d x=%d\n", d, o, x); return 0; } 10 d=10 o=8 x=16

문자와 문자열 입력 분류 형식 지정자 설명 문자형 %c char형으로 입력받음 %s 공백 문자가 아닌 문자부터 공백 문자가 나올 때까지를 문자열로 변환하여 입력받음. %[abc] 대괄호 안에 있는 문자 a,b,c로만 이루어진 문자열을 읽어 들인다. %[^abc] 대괄호 안에 있는 문자 a,b,c만을 제외하고 다른 문자들로 이루어진 문자열을 읽어 들인다. %[0-9] 0에서 9까지의 범위에 있는 문자들로 이루어진 문자열을 읽어 들인다.

문자와 문자열 읽기

scanf6.c #include <stdio.h> int main(void) { char c; char s[80], t[80]; printf("스페이스로 분리된 문자열을 입력하시오:"); scanf("%s%c%s", s, &c, t); printf("입력된 첫번째 문자열=%s\n", s); printf("입력된 문자=%c\n", c); printf("입력된 두번째 문자열=%s\n", t); return 0; } 스페이스로 분리된 문자열을 입력하시오:Hello World 입력된 첫번째 문자열=Hello 입력된 문자= 입력된 두번째 문자열=World

문자집합으로 읽기 #include <stdio.h> int main(void) { char s[80]; printf("문자열을 입력하시오:"); scanf("%[abc]", s); printf("입력된 문자열=%s\n", s); return 0; } 문자열을 입력하시오:abcdef 입력된 문자열=abc

문자집합으로 읽기 #include <stdio.h> int main(void) { char s[80]; printf("문자열을 입력하시오:"); scanf("%[a-z]", s); // 알파벳 소문자(a-z)로 구성된 문자열만 입력 printf("입력된 문자열=%s\n", s); return 0; } 문자열을 입력하시오:abcdefghijklmnOPQRSTUVWXYZ 입력된 문자열=abcdefghijklmn

특정 문자를 무시 #include <stdio.h> int main(void) { int year, month, day; printf("날짜를 입력하시오: "); scanf("%d%*d%*d", &year, &month, &day); printf("입력된 날짜는 %d년 %d월 %d일입니다.\n", year, month, day); return 0; } 날짜를 입력하시오: 2007.9.1 입력된 날짜는 2007년 9월 1일입니다.

scanf() 사용시 주의점 입력값을 저장할 변수의 주소를 전달 int i; scanf("%d", i); // 오류!! 배열의 이름은 배열을 가리키는 포인터 int str[80]; scanf("%s", str); // 올바름 scanf("%s", &str); // 오류!! 충분한 공간을 확보 scanf("%s", str); // 입력된 문자의 개수가 79를 초과하면 치명적인 오류 발생 scanf()의 형식 제어 문자열의 끝에 줄바꿈 문자 '\n'을 사용하는 것은 해당 문자가 반드시 입력되어야 한다는 의미 scanf("%d\n", &i);// 잘못됨!!

라이브러리 함수 memset() void *memset(void *dest, int c, size_t count); #include <memory.h> #include <stdio.h> int main( void ) { char buffer[] = "This is a test of the memset function“; printf( "Before: %s\n", buffer ); memset( buffer, '*', 4 ); printf( "After: %s\n", buffer ); return 0; } Before: This is a test of the memset function After: **** is a test of the memset function

라이브러리 함수 memcpy() void *memcpy(void *dest, const void *src, size_t count); #include <memory.h> #include <string.h> #include <stdio.h> char str1[7] = "aabbcc" int main( void ) { printf( "The string: %s\n", str1 ); memcpy( str1 + 2, str1, 4 ); printf( "New string: %s\n", str1 ); strcpy( str1, sizeof(str1), "aabbcc" ); // 문자열을 다시 초기화한다. memmove( str1 + 2, str1, 4 ); return 0; } The string: aabbcc New string: aaaabb

라이브러리 함수 memcpy() int memcmp(const void *buf1, const void *buf2, size_t count); #include <string.h> #include <stdio.h> int main( void ) { char first[] = "12345678901234567890" char second[] = "12345678901234567891" int result; printf( "Compare '%.19s' to '%.19s':\n", first, second ); result = memcmp( first, second, 19 ); if( result < 0 ) printf( "First is less than second.\n" ); else if( result == 0 ) printf( "First is equal to second.\n" ); else printf( "First is greater than second.\n" ); } Compare '1234567890123456789' to '1234567890123456789': First is equal to second.

라이브러리 함수 exit() exit()는 프로그램을 종료 atexit()는 exit()가 호출되는 경우에 수행되는 함수들을 등록 #include <stdlib.h> #include <stdio.h> void fn1( void ), fn2( void ); int main( void ) { atexit( fn1 ); atexit( fn2 ); printf( "프로그램이 종료되었습니다.\n" ); } void fn1() printf( "여기서 메모리 할당을 해제합니다.\n" ); void fn2() printf( "여기서 종료 안내 메시지를 내보냅니다.\n" ); 프로그램이 종료되었습니다. 여기서 종료 안내 메시지를 내보냅니다. 여기서 메모리 할당을 해제합니다.

라이브러리 함수 qsort() 퀵정렬을 수행하는 라이브러리 함수 void qsort(void *base,size_t num,size_t width,int (*compare)(const void *, const void *) compare( (void *) elem1, (void *) elem2 ); 반환값 설명 < 0 elem1이 elem2보다 작으면 elem1이 elem2과 같으면 > 0 elem1이 elem2보다 크면

라이브러리 함수 qsort() #include <stdlib.h> #include <string.h> #include <stdio.h> // int compare( const void *arg1, const void *arg2 ) { if( *(double *)arg1 > *(double *)arg2 ) return 1; else if( *(double *)arg1 == *(double *)arg2 ) return 0; else return -1; } int main(void) int i; double list[5] = {2.1, 0.9, 1.6, 3.8, 1.2}; qsort( (void *)list, (size_t)5, sizeof(double), compare ); for(i=0;i<5;i++) printf("%f ", list[i]); return 0; 0.900000 1.200000 1.600000 2.100000 3.800000

Q & A