ABC 11장

Similar documents
Microsoft PowerPoint - chap11.ppt [호환 모드]

본 강의에 들어가기 전

Microsoft PowerPoint - chap13-입출력라이브러리.pptx

chap7.key

歯9장.PDF

ABC 11장

PowerPoint Template

PowerPoint 프레젠테이션

금오공대 컴퓨터공학전공 강의자료

PowerPoint 프레젠테이션

Microsoft PowerPoint - 제11강 파일 처리

<4D F736F F F696E74202D2034C5D8BDBAC6AEC6C4C0CFC0D4C3E2B7C2312E505054>

Microsoft PowerPoint - chap4 [호환 모드]

PowerPoint 프레젠테이션

Microsoft PowerPoint - Chap14_FileAccess.pptx

< E20C6DFBFFEBEEE20C0DBBCBAC0BB20C0A7C7D12043BEF0BEEE20492E707074>

untitled

untitled

슬라이드 1

Microsoft PowerPoint - Lesson13.pptx

제1장 Unix란 무엇인가?

슬라이드 1

BMP 파일 처리


Microsoft PowerPoint - 09_(C_Programming)_(Korean)_File_Processing

11장 포인터

본 강의에 들어가기 전

untitled

제 14 장포인터활용 유준범 (JUNBEOM YOO) Ver 본강의자료는생능출판사의 PPT 강의자료 를기반으로제작되었습니다.

Microsoft PowerPoint - ch07 - 포인터 pm0415

OCW_C언어 기초

C Programming

0. 표지에이름과학번을적으시오. (6) 1. 변수 x, y 가 integer type 이라가정하고다음빈칸에 x 와 y 의계산결과값을적으시오. (5) x = (3 + 7) * 6; x = 60 x = (12 + 6) / 2 * 3; x = 27 x = 3 * (8 / 4

Computer Programming (2008 Fall)

Microsoft PowerPoint - chap06-1Array.ppt

C 언어 프로그래밊 과제 풀이

금오공대 컴퓨터공학전공 강의자료

11장 포인터

제1장 Unix란 무엇인가?

Microsoft PowerPoint - [2009] 02.pptx

중간고사

쉽게 풀어쓴 C 프로그래밍

Microsoft PowerPoint - chap11-1.ppt [호환 모드]

: 1 int arr[9]; int n, i; printf(" : "); scanf("%d", &n); : : for(i=1; i<10; i++) arr[i-1] = n * i; for(i=0; i<9; i++) if(i%2 == 1) print

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

Microsoft PowerPoint - chap11-포인터의활용.pptx

Microsoft PowerPoint - 10_C_Language_Text_Files

제1장 Unix란 무엇인가?

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C D616E2E637070>

À©µµ³×Æ®¿÷ÇÁ·Î±×·¡¹Ö4Àå_ÃÖÁ¾

윤성우의 열혈 TCP/IP 소켓 프로그래밊

제12장 파일 입출력

Microsoft PowerPoint - chap10-함수의활용.pptx

11장 포인터

제7장 C 표준 파일 입출력

Microsoft PowerPoint - chap03-변수와데이터형.pptx

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

프로그래밍개론및실습 2015 년 2 학기프로그래밍개론및실습과목으로본내용은강의교재인생능출판사, 두근두근 C 언어수업, 천인국지음을발췌수정하였음

제7장 C 표준 파일 입출력

Microsoft PowerPoint APUE(Intro).ppt


PowerPoint 프레젠테이션

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

11장 포인터

Microsoft PowerPoint - chap05-제어문.pptx

Microsoft PowerPoint - chap06-2pointer.ppt

Microsoft PowerPoint - chap04-연산자.pptx

13 주차문자열의표현과입출력

ABC 6장

; struct point p[10] = {{1, 2, {5, -3, {-3, 5, {-6, -2, {2, 2, {-3, -3, {-9, 2, {7, 8, {-6, 4, {8, -5; for (i = 0; i < 10; i++){ if (p[i].x > 0 && p[i

1.2 자료형 (data type) 프로그램에서다루는값의형태로변수나함수를정의할때주로사용하며, 컴퓨터는선언된 자료형만큼의메모리를확보하여프로그래머에게제공한다 정수 (integer) 1) int(4 bytes) 연산범위 : (-2 31 ) ~ (2 31 /2)-

Microsoft PowerPoint - C프로그래밍-chap15.ppt [호환 모드]

ch15

Microsoft PowerPoint - chap-11.pptx

ABC 3장

02장.배열과 클래스

Microsoft PowerPoint - 제11장 포인터(강의)

Microsoft PowerPoint - 10장 문자열 pptx

03장.스택.key

<4D F736F F F696E74202D20C1A63134C0E520C6F7C0CEC5CD5FC8B0BFEB>

설계란 무엇인가?

PowerPoint Presentation

제 11 장포인터 유준범 (JUNBEOM YOO) Ver 본강의자료는생능출판사의 PPT 강의자료 를기반으로제작되었습니다.

학습목차 2.1 다차원배열이란 차원배열의주소와값의참조

Microsoft PowerPoint - chap12-고급기능.pptx

Chapter_06

PowerPoint 프레젠테이션

컴파일러

비트와바이트 비트와바이트 비트 (Bit) : 2진수값하나 (0 또는 1) 를저장할수있는최소메모리공간 1비트 2비트 3비트... n비트 2^1 = 2개 2^2 = 4개 2^3 = 8개... 2^n 개 1 바이트는 8 비트 2 2

Microsoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100

Microsoft PowerPoint - Ch12.파일.pptx

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

Tcl의 문법

Microsoft PowerPoint - 제11장 포인터

목차 포인터의개요 배열과포인터 포인터의구조 실무응용예제 C 2

이번장에서학습할내용 동적메모리란? malloc() 와 calloc() 연결리스트 파일을이용하면보다많은데이터를유용하고지속적으로사용및관리할수있습니다. 2

C 프로그램의 기본

슬라이드 1

Microsoft PowerPoint - Chapter_08.pptx

<4D F736F F F696E74202D20C1A63137C0E520B5BFC0FBB8DEB8F0B8AEBFCD20BFACB0E1B8AEBDBAC6AE>

Transcription:

12 장입력과출력

getchar()/putchar() printf()/scanf() sprintf()/sscanf() 파일입출력 fprintf()/fscanf() 파일의임의의위치접근 내용 ftell(), fseek(), rewind() 텍스트파일 이진파일 fread()/fwrite() 1

getchar()/putchar() 함수원형 int getchar(void); int putchar(int c); getchar() 표준입력장치로문자를하나읽는함수 읽을문자가없으면 EOF 리턴 putchar() 표준출력장치로문자를하나쓰는함수 2

표준입출력장치 표준입력장치 : 디폴트로는키보드 표준출력장치 : 디폴트로는화면 표준입출력장치는변경할수있음 입출력재지정 파이프 3

입출력재지정 (<, >) 표준입출력장치 $ io_prog < in_file > out_file io_prog 의표준입력장치는 in_file 파일이되고, 표준출력장치는 out_file 파일이됨 파이프 $ io_prog1 io_prog2 io_prog3 io_prog2 의표준입력장치는첫번째파이프 (io_prog1 의표준출력 ) io_prog2 의표준출력장치는두번째파이프 (io_prog3 의표준입력 ) 4

프로그램 12.1 getchar()/putchar() #include <stdio.h> int main(void) { int c; while ((c = getchar())!= EOF) { putchar(c); } } return 0; 5

$ pass abcdefg abcdefg hij hij ^d $ ls pass bin etc include lib local man sbin tmp var $ pass < infile > outfile 프로그램결과 6

printf() 첫번째인자를제어문자열이라고함 제어문자열에서 % 부터변환문자까지를변환명세라고함 첫번째인자인제어문자열을화면에출력하는데, 변환명세가나오면뒤의인자를적절히형변환하여대신출력함 printf("%s 학생의점수는 %d 점입니다.",name,grade); 변환명세보다인자가많으면여분의인자는무시됨 인자가적으면시스템종속적인일이일어남 7

변환명세의형식 printf() %[ 플래그 ][ 폭 ][. 정밀도 ][ 형변환자 ] 변환문자 플래그, 폭,. 정밀도, 형변환자 : 옵션 변환문자 : 생략할수없음 8

변환문자 c 출력형태 문자 d, i 10 진정수 u o 부호없는 10 진정수 부호없는 8 진정수 printf() x, X 부호없는 16 진정수, 예 : 5dee, 5DEE f, F 부동소수점표기법의실수, 예 : 7.123000 e, E 지수표기법의실수, 예 : 7.123000e+00, 7.123000E+00 a, A (C99) 16 진지수표기법의실수, 예 : 0x7.123p+20, 0X7.123P+20 g, G e 형식과 f 형식중짧은것또는 E 형식과 F 형식중짧은것 s p n 널로끝나는문자열 포인터값의 16 진정수 출력되는것없음, 대응되는정수적형포인터인자에현재까지출력된문자의개수를배정함 % % 문자, 대응되는인자없음 9

printf() 플래그 출력형식조정 플래그 의미 - 필드에서좌측정렬로출력 + 숫자앞에 + 나 - 를항상붙임출력 공백 양수앞에공백을붙여출력 0 숫자를우측정렬로출력할때남는공간을 0 으로채워서출력 # 8 진수는앞에 0, 16 진수는앞에 0x, 실수는소수점을출력 * 필드 : 인자가출력되는공간 ( 자리 ) 10

폭 필드의크기 ( 자리수 ) 지정 양의정수나 * * : 인자로받아들임 printf() 예 printf("i = %8d\n", i); printf("i = %*d\n", 8, i); 11

정밀도 점 (.) 뒤에명시 음이아닌정수나 * printf() * : 인자로받아들임 정밀도는변환문자별로의미가다름 d, i, o, u, x, X : 출력될숫자의최소자릿수 a, A, e, E, f, F : 소수점이하의자릿수 g, G : 최대유효숫자 s : 문자열로부터출력될문자의최대개수 12

printf() 형변환자 인자의크기지정 형변환자뒤에올수있는변환문자변환형 hh d, i, o, u, x, X signed/unsigned char h d, i, o, u, x, X signed/unsigned short l d, i, o, u, x, X signed/unsigned long l c wint_t l s wchar_t l a, A, e, E, f, F, g, G 무시 ll d, i, o, u, x, X signed/unsigned long long j d, i, o, u, x, X intmax_t나 uintmax_t z d, i, o, u, x, X size_t t d, i, o, u, x, X ptrdiff_t L a, A, e, E, f, F, g, G long double 13

printf() 프로그램 12.2 #include <stdio.h> int main(void){ char c = 'A', s[] = "test string"; int i = 1024; int j = 9, k = 2; long l = 12345678; long long ll = 12345678901234LL; float f = 123.45678, f0 = 987.0; double d = -123.45678, d0 = 0.00000009; printf(">> 문자출력 <<\n"); printf("%%c: %c, %%7c: %7c, %%+7c: %+7c \n", c, c, c); printf("%%s: %s, %%7s: %7s, %%+7s: %+7s \n", s, s, s); printf("%%.7s: %.7s, %%10.7s: %10.7s, %%+10.7s: %+10.7s \n", s, s, s); printf("c 는재미있는 %n\n", &j); printf("%*c 프로그래밍언어입니다.\n", j, ' '); 14

프로그램결과 >> 문자출력 << %c: A, %7c: A, %+7c: A %s: test string, %7s: test string, %+7s: test string %.7s: test st, %10.7s: test st, %+10.7s: test st C는재미있는 프로그래밍언어입니다. 15

printf() 프로그램 12.2 int i = 1024; int j = 9, k = 2; long l = 12345678; long long ll = 12345678901234LL; printf("\n>> 정수출력 <<\n"); printf("%%d: %d, %%o: %o, %%x: %x, %%u: %u \n", i, i, i, i); printf("%%07d: %07d, %%0.7d: %0.7d, %%+d: %+d \n", i, i, i); printf("%%x: %X, %%#x: %#x, %%#X: %#X \n", i, i, i); printf("%%ld: %ld, %%lo: %lo, %%lx: %lx \n", l, l, l); printf("%%lld: %lld, %%llo: %llo, %%llx: %llx \n", ll, ll, ll); 16

프로그램결과 >> 정수출력 << %d: 1024, %o: 2000, %x: 400, %u: 1024 %07d: 0001024, %0.7d: 0001024, %+d: +1024 %X: 400, %#x: 0x400, %#X: 0X400 %ld: 12345678, %lo: 57060516, %lx: bc614e %lld: 12345678901234, %llo: 263516363427762, %llx: b3a73ce2ff2 17

printf() 프로그램 12.2 float f = 123.45678, f0 = 987.0; double d = -123.45678, d0 = 0.00000009; } printf("\n>> 실수출력 <<\n"); printf("%%f: %f, %%e: %e, %%g: %g \n", f, f, f); printf("%%.3f: %.3f, %%.3e: %.3e, %%.3g: %.3g \n", f, f, f); printf("%%10.3f: %10.3f, %%10.3e: %10.3e, %%10.3g: %10.3g \n", f, f, f); printf("%%*.*f: %*.*f \n", j, k, f); printf("%%f: %f, %%e: %e, %%g: %g \n", f0, f0, f0); printf("%%#f: %#f, %%#e: %#e, %%#g: %#g \n", f0, f0, f0); printf("%%f: %f, %%e: %e, %%g: %g \n", d, d, d); printf("%%*f: %*f, %%.*f: %.*f, %%*.*f: %*.*f \n", j, d, k, d, j, k, d); printf("%%f: %f, %%e: %e, %%g: %g \n", d0, d0, d0); return 0; 18

프로그램결과 >> 실수출력 << %f: 123.456779, %e: 1.234568e+02, %g: 123.457 %.3f: 123.457, %.3e: 1.235e+02, %.3g: 123 %10.3f: 123.457, %10.3e: 1.235e+02, %10.3g: 123 %*.*f: 123.46 %f: 987.000000, %e: 9.870000e+02, %g: 987 %#f: 987.000000, %#e: 9.870000e+02, %#g: 987.000 %f: -123.456780, %e: -1.234568e+02, %g: -123.457 %*f: -123.456780, %.*f: -123.46, %*.*f: -123.46 %f: 0.000000, %e: 9.000000e-08, %g: 9e-08 19

scanf() 첫번째인자를제어문자열이라고함 제어문자열에서 % 부터변환문자까지를변환명세라고함 입력스트림에서변환명세대로읽어서대응인자에배정함 대응인자는포인터이어야함 첫번째인자인제어문자열에서제어문자가아닌일반문자는입력스트림에서똑같은문자를제거함 scanf("name : %s", s); 20

변환명세의형식 %[*][ 폭 ][ 형변환자 ] 변환문자 *, 폭, 형변환자 : 옵션 변환문자 : 생략할수없음 scanf() 21

scanf() 변환문자입력형태대응인자형 c 공백을포함한모든문자 char 포인터 d, i 10 진정수 ( 부호는옵션 ) 정수포인터 u 10 진정수 ( 부호는옵션 ) 부호없는정수포인터 o 8 진정수 ( 부호는옵션 ) 부호없는정수포인터 x 16 진정수 ( 부호는옵션 ) 부호없는정수포인터 a, e, f, g 실수 ( 부호는옵션 ) 실수포인터 s 공백없는문자열 char 포인터 p 보통 16진정수 ( 시스템에따라다름 ) void 포인터 n 지금까지읽은문자개수를대응인자에배 정수포인터 정, 입력스트림의내용은안읽음 % 입력스트림에서 % 읽음 대응인자없음 [ ] 다음에설명 char 포인터 22

변환문자 [ ] scanf() 원하는문자들 ( 스캔집합 ) 로만구성된문자열을읽어드림 [ ] 내의첫번째문자가 ^ 가아니면괄호내의문자가스캔집합이되고, ^ 이면괄호내의문자를제외한문자들이스캔집합이됨 입력스트림에서스캔집합이외의문자가나올때까지읽어서대응인자에배정함 scanf("%[^ \n\t]", s); // 공백, 개행, 탭제외 scanf("%[0-9a-fa-f]", s); // 숫자와알파벳 23

* 입력스트림의내용을지움 예제 scanf("%d %*d %d", &a, &b); 입력스트림 : 20 40 50 scanf() 20 은 a 에, 40 은무시, 50 은 b 에저장 24

폭 scanf() 읽어들일필드의최대크기 ( 문자수 ) 지정 예제 scanf("%3d %5c", &a, s); 입력스트림 : 1234567890 123 은 a 에, 45678 은 s 에저장 25

형변환자 인자의크기지정 scanf() 형변환자뒤에올수있는변환문자인자의형 hh d, i, o, u, x, X, n signed/unsigned char 포인터 h d, i, o, u, x, X, n signed/unsigned short 포인터 l d, i, o, u, x, X, n signed/unsigned long 포인터 l c, s, [ ] wchar_t 포인터 l a, A, e, E, f, F, g, G double 포인터 ll d, i, o, u, x, X, n signed/unsigned long long 포인터 j d, i, o, u, x, X, n intmax_t 나 uintmax_t 포인터 z d, i, o, u, x, X, n size_t 포인터 t d, i, o, u, x, X, n ptrdiff_t 포인터 L a, A, e, E, f, F, g, G long double 포인터 26

sprintf()/sscanf() printf() 와 scanf() 의문자열버전 표준입출력장치로입출력하는것이아니라문자열에쓰거나읽음 첫번째인자로입출력을위한문자열이오고나머지인자는 printf(), scanf() 와같음 27

프로그램 12.3 sprintf()/sscanf() void cal(char * express, char *result){ int opd1, opd2; char op; if (sscanf(express, "%d %c %d", &opd1, &op, &opd2)!= 3) { sprintf(result, " 수식오류 "); return; } if (op == '+') sprintf(result, "%d", opd1 + opd2); else if (op == '-') sprintf(result, "%d", opd1 - opd2); else if (op == '*') sprintf(result, "%d", opd1 * opd2); else if (op == '/') sprintf(result, "%.3f", (float)opd1 / opd2); else sprintf(result, " 수식오류 "); } 28

프로그램 12.3 int main(void){ char express[21]; char result[10]; sprintf()/sscanf() printf(" 수식을입력하세요 : "); scanf("%20[^\n]", express); cal(express, result); printf("%s = %s\n", express, result); } return 0; 29

프로그램결과 $ calculate 수식을입력하세요 : 19-3 19-3 = 16 $ calculate 수식을입력하세요 : 57 / 9 57 / 9 = 6.333 $ calculate 수식을입력하세요 : 45* 543 45* 543 = 24435 $ calculate 수식을입력하세요 : 90 34 90 34 = 수식오류 30

sprintf()/sscanf() sprintf() 나 sscanf() 는호출될때마다문자열의처음부터쓰거나읽음 char str[] = "1234567890"; int a, b, c, d; sscanf(str, "%2d%2d", &a, &b); sscanf(str, "%2d%2d", &c, &d); // a = 12, b = 34 // c = 12, b = 34 31

파일입출력 파일입출력을위해서는파일을먼저열고해야함 관련함수들 fopen() fclose() fprintf() fscanf() 32

fopen() 파일을열기전에는파일의내용을보거나쓸수없음 fopen() 함수는파일이름과모드를인자로받음 fopen() 은지정된모드로파일을열고그파일을접근할수있게 FILE 포인터를리턴함 파일열기를실패하면 NULL 을리턴함 33

fopen() 모드 모드 "r" "w" "a" "rb" "wb" "ab" 의미읽기위해문서파일열기쓰기위해문서파일열기첨부하기위해문서파일열기읽기위해이진파일열기쓰기위해이진파일열기첨부하기위해이진파일열기 모드뒤의 + 는파일을읽기와쓰기로모두연다는것을의미함 34

사용예 fopen() FILE *ifp, *ofp; ifp = fopen("infile", "r"); ofp = fopen("outfile", "w"); infile과 outfile로데이터를읽고쓸때 ifp와 ofp 를통해읽거나써야함 if ((ifp = fopen("infile", "r")) == NULL) printf(" 오류 : 파일을열수없습니다."); else... // 파일읽기 // 오류처리 35

<stdio.h> 에정의 표준파일포인터 파일포인터 설명 비고 stdin 표준입력파일 키보드로연결됨 stdout 표준출력파일 화면으로연결됨 stderr 표준에러파일 화면으로연결됨 36

fclose() 파일을다사용한후에는 fclose() 를사용하여닫아야함 fclose() 의인자로는 fopen() 에의해리턴된 FILE 포인터를명시해야함 예제 fclose(ifp); fclose(ofp); 37

getc()/putc() FILE 포인터를갖는다는것만제외하면 getchar()/ putchar() 와같음 getchar() : getc(stdin) putchar(c) : putc(c, stdout) 예제 c = getc(ifp); putc(c, ofp); 38

프로그램 12.4 int main(int argc, char **argv){ FILE *ifp, *ofp; int c; } getc()/putc() if (argc!= 3) { printf(" 실행오류 : \n 사용법 : %s from_file to_file\n", argv[0]); exit(1); } if ((ifp = fopen(argv[1], "r")) == NULL){ printf(" 오류 : %s 파일을열수없습니다.\n", argv[1]); exit(1); } if ((ofp = fopen(argv[2], "w")) == NULL){ printf(" 오류 : %s 파일을열수없습니다.\n", argv[2]); exit(1); } while ((c = getc(ifp))!= EOF) putc(c, ofp); fclose(ifp); fclose(ofp); return 0; 39

fprintf()/fscanf() printf()/scanf() 함수의파일버전 첫번째인자는 FILE 포인터이고나머지는 printf()/ scanf() 와같음 printf(...) : fprintf(stdout,...) scanf(...) : fscanf(stdin,...) 40

프로그램 12.5 #include <stdio.h> #include <stdlib.h> int main(int argc, char **argv) { FILE *pro, *sol; int c, i, opd1, opd2; char word[50]; fprintf()/fscanf() if (argc!= 3) { fprintf(stderr, " 실행오류 :\n 사용법 : %s data_file out_file\n,argv[0]); exit(1); } if ((pro = fopen(argv[1], "w")) == NULL){ fprintf(stderr, " 오류 : %s 파일을열수없습니다.\n", argv[1]); exit(1); } 41

fprintf()/fscanf() 프로그램 12.5 for (i = 0; i < 50; i++) fprintf(pro, "%d + %d = \n", rand() % 1000, rand() % 1000); fclose(pro); if ((pro = fopen(argv[1], "r")) == NULL){ fprintf(stderr, " 오류 : %s 파일을열수없습니다.\n", argv[1]); exit(1); } if ((sol = fopen(argv[2], "w")) == NULL){ fprintf(stderr, " 오류 : %s 파일을열수없습니다.\n", argv[2]); exit(1); } while (fscanf(pro, "%d + %d = \n", &opd1, &opd2)!= EOF) fprintf(sol, "%d + %d = %d\n", opd1, opd2, opd1 + opd2); fclose(pro); fclose(sol); } return 0; 42

파일의임의의위치접근 입출력함수는이전에마지막으로입출력이일어난곳부터입출력을실행함 파일위치지시자 파일위치지사자와관련된함수들 ftell() fseek() rewind() 43

ftell() 파일의임의의위치접근 파일위치지시자의현재값을리턴 사용예 pos = ftell(file_ptr); FILE_ptr과관련된파일위치지시자를 pos에배정 리턴된값은파일의처음부터몇바이트떨어진곳인가를나타냄 44

fseek() 파일의임의의위치접근 파일위치지시자의값을직접지정함 사용예 fseek(file_ptr, offset, place) 파일위치지시자를 place 부터 offset 바이트떨어진곳을나타내는값으로설정함 place 값기호문자의미 0 SEEK_SET 파일의시작 1 SEEK_CUR 현재위치 2 SEEK_END 파일의끝 45

rewind() 파일의임의의위치접근 파일위치지시자를파일의제일앞으로지정함 사용예 rewind(file_ptr) fseek(file_ptr, 0, SEEK_SET) 과같음 46

프로그램 12.6 파일의임의의위치접근 int main(void){ char fname[maxstring]; int c; FILE* ifp; fprintf("\n입력파일 : "); scanf("%s", fname); ifp = fopen(fname, "r"); fseek(ifp, 0, SEEK_END); if (ftell(itp) == 0) return 0; fseek(ifp, 1, SEEK_CUR); } while (1) > 0) { c = getc(ifp); putchar(c); if (ftell(itp) == 1) break; fseek(ifp, 2, SEEK_CUR); } fclose(ifp); return 0; 47

텍스트파일 putc() 나 fprintf() 는문자로출력함 아스키값으로파일에저장됨 문서편집기로내용을확인할수있음 텍스트로저장하면내용을쉽게파악할수있어좋지만파일의크기가커지고, 데이터의직접접근이어려워짐 48

예 텍스트파일 struct student{ int id; char name[10]; int grade[3]; // 국어, 수학, 영어성적 int sum; // 성적합 float avg; // 성적평균 }; for (i = 0; i < N; i++) fprintf(output, "%d %s %d %d %d %d %f\n", st[i].id, st[i].name, st[i].grade[0], st[i].grade[1], st[i].grade[2], st[i].sum, st[i].avg); 각학생별레코드크기가다름 100 번째학생의정석을찾기위해서는처음부터읽어야함 49

이진파일 메모리내용과같은형식으로작성된파일 관련함수 fwrite() fread() 50

fwrite() 함수원형 size_t fwrite(const void *buffer, size_t size, size_t count, FILE *FP); buffer : 파일에쓸데이터를가지고있는포인터 size : 저장할각객체의크기 count : 저장한객체의수 FP : 저장할파일포인터 51

프로그램 12.7 #include <stdio.h> fwrite() typedef struct student{ int id; char name[10]; int grade[3]; // 국어, 수학, 영어성적 int sum; // 성적합 float avg; // 성적평균 } student; int main(int argc, char **argv){ FILE *ofp; int id, check; student st = {0, "", {0}, 0, 0.0}; if (argc!= 2) { fprintf(stderr, " 실행오류 : \n 사용법 : %s out_file\n", argv[0]); exit(1); } if ((ofp = fopen(argv[1], "wb")) == NULL){ fprintf(stderr, " 오류 : %s 파일을열수없습니다.\n", argv[1]); exit(1); } 52

fwrite() 프로그램 12.7 fprintf(stderr, " 성적을입력하세요.\n"); fprintf(stderr, " 입력형식 : 이름국어성적수학성적영어성적 \n"); } id = 1; check = scanf("%s %d %d %d", st.name, &st.grade[0], &st.grade[1], &st.grade[2]); while (check!= EOF) { st.id = id++; fwrite(&st, sizeof(student), 1, ofp); check = scanf("%s %d %d %d", st.name, &st.grade[0], &st.grade[1], &st.grade[2]); } close(ofp); return 0; 53

프로그램결과 $ input_grade output 성적을입력하세요. 입력형식 : 이름국어성적수학성적영어성적하나 78 90 100 둘 8 98 67 셋 78 90 88 넷 78 88 90 다섯 58 88 91 여섯 77 70 76 ^D $ cat output ꠑ 하나 N Z d ꠓ 둘찺 Z d ꠗ 셋찺 Z d ꠙ 넷찺 Z d ꠛ 다섯 N Z d ꠚ 여섯 N Z d 54

fread() 함수원형 size_t fread(void *buffer, size_t size, size_t count, FILE *FP); buffer : 파일에서읽은데이터를저장할포인터 size : 각객체의크기 count : 객체의수 FP : 읽을파일포인터 55

프로그램 12.8 #include <stdio.h> fread() typedef struct student{ int id; char name[10]; int grade[3]; // 국어, 수학, 영어성적 int sum; // 성적합 float avg; // 성적평균 } student; int main(int argc, char **argv){ FILE *ifp; int check; student st = {0, "", {0}, 0, 0.0}; if (argc!= 2) { fprintf(stderr, " 실행오류 : \n 사용법 : %s in_file\n", argv[0]); exit(1); } if ((ifp = fopen(argv[1], "rb")) == NULL){ fprintf(stderr, " 오류 : %s 파일을열수없습니다.\n", argv[1]); exit(1); } 56

fread() 프로그램 12.8 fprintf(stderr, " 번호이름국어수학영어 \n"); } check = fread(&st, sizeof(student), 1, ifp); while (check) { printf("%3d %-5s %3d %3d %3d\n", st.id, st.name, st.grade[0], st.grade[1], st.grade[2]); check = fread(&st, sizeof(student), 1, ifp); } close(ifp); return 0; 57

프로그램결과 $ print_grade output 번호이름국어수학영어 1 하나 78 90 100 2 둘 8 98 67 3 셋 78 90 88 4 넷 78 88 90 5 다섯 58 88 91 6 여섯 77 70 76 7 일곱 100 90 9 8 여덜 98 100 87 9 아홉 93 95 50 10 열 66 90 88 58

이진파일 프로그램 12.9 일부 case 1 : // 전체성적출력 rewind(fp); fprintf(stderr, " 번호이름국어수학영어총점평균 \n"); check = fread(&st, sizeof(student), 1, fp);... case 2 : // 개인적출력 fprintf(stderr, " 학생 id : "); scanf("%d", &id); fseek(fp, sizeof(student) * (id - 1), SEEK_SET); check = fread(&st, sizeof(student), 1, fp);... case 3 : // 성적추가... fseek(fp, 0, SEEK_END); st.id = ftell(fp) / sizeof(student) + 1;... fwrite(&st, sizeof(student), 1, fp); fflush(fp); 59

프로그램 12.9 일부 이진파일 case 4 : // 성적수정 fprintf(stderr, " 학생 id : "); scanf("%d", &id); fseek(fp, sizeof(student) * (id - 1), SEEK_SET); check = fread(&st, sizeof(student), 1, fp);... fseek(fp, -sizeof(student), SEEK_CUR); fwrite(&st, sizeof(student), 1, fp);... 60

프로그램 12.9 일부 이진파일 case 5 : // 성적처리 rewind(fp); check = fread(&st, sizeof(student), 1, fp); while (check){ st.sum = st.grade[0] + st.grade[1] + st.grade[2]; st.avg = st.sum / 3.0; fseek(fp, -sizeof(student), SEEK_CUR); fwrite(&st, sizeof(student), 1, fp); check = fread(&st, sizeof(student), 1, fp); }... 61

원하는번호를입력하세요. 1 : 전체성적출력 2 : 학생별출력 3 : 성적추가 4 : 성적수정 5 : 성적처리 0 : 종료 1 번호이름국어수학영어총점평균 1 하나 78 90 100 0 0.00 2 둘 8 98 67 0 0.00 3 셋 78 90 88 0 0.00 4 넷 78 88 90 0 0.00 5 다섯 58 88 91 0 0.00 6 여섯 77 70 76 0 0.00 7 일곱 100 90 9 0 0.00 8 여덜 98 100 87 0 0.00 9 아홉 93 95 50 0 0.00 10 열 66 90 88 0 0.00 프로그램결과 62

원하는번호를입력하세요. 1 : 전체성적출력 2 : 학생별출력 3 : 성적추가 4 : 성적수정 5 : 성적처리 0 : 종료 5 성적처리완료 프로그램결과 원하는번호를입력하세요. 1 : 전체성적출력 2 : 학생별출력 3 : 성적추가 4 : 성적수정 5 : 성적처리 0 : 종료 2 학생 id : 4 번호 : 4 이름 : 넷국어 : 78 수학 : 88 영어 : 90 총점 : 256 평균 : 85.33 63

프로그램결과 원하는번호를입력하세요. 1 : 전체성적출력 2 : 학생별출력 3 : 성적추가 4 : 성적수정 5 : 성적처리 0 : 종료 4 학생 id : 4 넷학생성적을입력하세요 : 100 98 100 원하는번호를입력하세요. 1 : 전체성적출력 2 : 학생별출력 3 : 성적추가 4 : 성적수정 5 : 성적처리 0 : 종료 3 이름과성적을입력하세요 : 끝 100 100 100 64

프로그램결과 원하는번호를입력하세요. 1 : 전체성적출력 2 : 학생별출력 3 : 성적추가 4 : 성적수정 5 : 성적처리 0 : 종료 1 번호이름국어수학영어총점평균 1 하나 78 90 100 268 89.33 2 둘 8 98 67 173 57.67 3 셋 78 90 88 256 85.33 4 넷 100 98 100 298 99.33 5 다섯 58 88 91 237 79.00 6 여섯 77 70 76 223 74.33 7 일곱 100 90 9 199 66.33 8 여덜 98 100 87 285 95.00 9 아홉 93 95 50 238 79.33 10 열 66 90 88 244 81.33 11 끝 100 100 100 300 100.00 65