슬라이드 1

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

본 강의에 들어가기 전

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

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

Microsoft PowerPoint - Lesson13.pptx

ABC 11장

歯9장.PDF

chap7.key

11장 포인터

Microsoft PowerPoint - 제11강 파일 처리

PowerPoint 프레젠테이션

<4D F736F F F696E74202D2034C5D8BDBAC6AEC6C4C0CFC0D4C3E2B7C2312E505054>

PowerPoint 프레젠테이션

Microsoft PowerPoint - chap06-1Array.ppt

PowerPoint 프레젠테이션

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

PowerPoint Template

Microsoft PowerPoint - Chap14_FileAccess.pptx

ABC 11장

C Programming

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

Microsoft PowerPoint - chap06-4 [호환 모드]

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

Microsoft PowerPoint - chap4 [호환 모드]

슬라이드 1

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

쉽게 풀어쓴 C 프로그래밍


표준입출력스트림 기본적인스트림들은프로그래머가생성하지않아도자동으로생성된다. 이름스트림연결장치 stdin 표준입력스트림키보드 stdout 표준출력스트림모니터의화면 stderr 표준오류스트림모니터의화면 입출력함수의분류 사용하는스트림에따른분류 표준입출력스트림을사용하여입출력을하

<4D F736F F F696E74202D20C1A63136C0E520C6C4C0CFC0D4C3E2B7C2>

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

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

Microsoft PowerPoint - chap06-2pointer.ppt

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

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

제1장 Unix란 무엇인가?

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

PowerPoint 프레젠테이션

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

untitled

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

C 언어와 프로그래밍 개요

Microsoft PowerPoint - 10_C_Language_Text_Files

설계란 무엇인가?

슬라이드 1

Microsoft PowerPoint APUE(Intro).ppt

본 강의에 들어가기 전

Microsoft PowerPoint - ch07 - 포인터 pm0415

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

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

C 언어와 프로그래밍 개요

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

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

슬라이드 1

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

< E20C6DFBFFEBEEE20C0DBBCBAC0BB20C0A7C7D12043BEF0BEEE20492E707074>

<4D F736F F F696E74202D D20B9AEC0DABFAD2C20BDBAC6AEB8B2B0FA20C6C4C0CF20C0D4C3E2B7C2>

슬라이드 1

Microsoft PowerPoint - [2009] 02.pptx

Microsoft PowerPoint - chap06-8 [호환 모드]

제7장 C 표준 파일 입출력

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

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

PowerPoint Presentation

제7장 C 표준 파일 입출력

제1장 Unix란 무엇인가?

11장 포인터

02장.배열과 클래스

OCW_C언어 기초

untitled

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

untitled

Microsoft PowerPoint - chap06-8.ppt

OCW_C언어 기초


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

Microsoft PowerPoint - ch01.ppt

C 프로그램의 기본

<4D F736F F F696E74202D20C1A633C0E52043C7C1B7CEB1D7B7A5B1B8BCBABFE4BCD2>

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C D616E2E637070>

PowerPoint 프레젠테이션

PowerPoint Presentation

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

11장 포인터

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

Microsoft PowerPoint 웹 연동 기술.pptx

기초컴퓨터프로그래밍

03 상수, 변수, 자료형

Microsoft PowerPoint - chap04-연산자.pptx

Microsoft PowerPoint - 10장 문자열 pptx

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

BMP 파일 처리

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

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

Microsoft PowerPoint - chap-03.pptx

제1장 Unix란 무엇인가?

중간고사

Microsoft PowerPoint - C프로그래밍-chap16.ppt

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C4C656D70656C2D5A69762E637070>

Transcription:

10 장입출력함수 박종혁교수 UCS Lab Tel: 970-6702 Email: jhpark1@seoultech.ac.kr SeoulTech 2017-1 st 프로그래밍입문 (1)

2 printf() 특징 임의의개수의인자출력 간단한변환명세나형식을사용한출력제어

3 printf() printf(control_string, other_argument) 예 printf("she sells %d %s for $%f", 99, "sea shells", 3.77); control_string: "she sells %d %s for $%f" other_arguments: 99, "sea shells", 3.77 변환명세는 % 로시작하여변환문자로끝남

4 printf() 변환문자 c d,i u o 문자 10 진정수 부호없는 10 진정수 부호없는 8 진정수 x, X 부호없는 16 진정수 e E printf() 변환문자 부동소수점수 ; 예 : 7.123000e+00 대응되는인자의출력형태 부동소수점수 ; 예 : 7.123000E+00 f 부동소수점수 ; 예 : 7.123000 g G s p n e 형식과 f 형식중짧은쪽 E 형식과 f 형식중짧은쪽 문자열 대응되는인자가 void 포인터임 ; 그값이 16 진수형태로출력됨 대응되는인자는정수형포인터로서그값은현재까지출력된문자의개수임 ; 인자는변환되지않음 % %% 의형식으로 % 를출력스트림에씀 ; 대응되는인자는없음.

5 printf() 예제 printf("she sells %d %s for $%f", 99, "sea shells", 3.77); 변환형식대응되는인자 %d %s %f 99 "sea shells" 3.77

6 printf() % 와변환문자사이에올수있는것들 플래그문자들 빼기기호 더하기기호 공백 # 기호 0 필드폭 정밀도 h 또는 l L

7 printf() 선언과초기화 char c = 'A', s[] = "Blue moon!"; 변환형식 대응되는인자 필드내에서출력형태 비고 %c c "A" 필드폭 1 ( 디폴트 ) %2c c " A" 필드폭 2, 우측정렬 %-3c c "A " 필드폭 3, 좌측정렬 %s s "Blue moon!" 필드폭 10 ( 디폴트 ) %3s s "Blue moon!" 공간이더필요함 %.6s s "Blue m" 정밀도 6 %-11.8s s "Blue moo " 정밀도 8, 좌측정렬

8 printf() 선언과초기화 int i = 123; double x = 0.123456789; 변환형식 대응되는인자 필드내에서출력형태 비고 %d i "123" 필드폭 3 ( 디폴트 ) %05d i "00123" 영으로채움 %7o i " 173" 우측정렬, 8 진수 %-9x i "7b " 좌측정렬, 16 진수 %-#9x i "0x7b " 좌측정렬, 16 진수 %10.5f x " 0.12346" 필드폭 10, 정밀도 5 %-12.5e x "1.23457-01 " 좌측정렬, e- 형식

9 scanf() scanf(control_string, other_argument) 예 char int n; double x; a, b, c, s[100]; scanf("%c%c%c%d%s%lf", &a,&b,&c,&n,s,&x); control_string: "%c%c%c%d%s%lf" other_arguments: &a, &b, &n, s, &x

10 scanf() scanf( ) 변환문자변환문자 입력스트림에서대응되는문자 대응인자의포인터형 c 공백을포함한모든문자 char d, i 10진정수 ( 부호는옵션 ) integer u 10진정수 ( 부호는옵션 ) unsigned integer o 8진수 ( 부호는옵션 ) unsigned integer x, X 16진수 ( 부호는옵션 ) unsigned integer e, E, f, g, G 실수 ( 부호는옵션 ) floating type s 공백없는문자열 Char p printf() 함수의 %p 에의해출력되는것으로일반적으로부호없는 16 진정수임 void * n, %, [...] 다음표참조

11 scanf() scanf( ) 변환문자 변환문자 설명 n 입력스트림의문자와짝을이루지않는다. 대응되는인자는정수형 포인터로서, 지금까지읽어들인문자의개수를저장한다. % 입력스트림에서하나의 % 와짝을이룬다. 대응되는인자는없다. [...] 각괄호 [ ] 안에있는문자들을스캔집합이라한다. 이것은무엇이짝을이루는가를결정한다. ( 아래설명을참조하여라.) 대응되는인자는문자배열의기본주소에대한포인터이고, 이배열은끝에자동적으로추가되는널문자를포함하여대응되는모든문자들을포함할만큼큰크기를가져야한다.

12 scanf() 제어문자열은다음과같은것을포함할수있음 여백 % 이외의공백문자가아닌일반문자 % 로시작해서변환문자로끝나는변환명세 h l L

13 scanf() 예제 int i; char c; char string[15]; scanf("%d, %*s %% %c %5s %s", &i, &c, string, &string[5]); * 입력스트림 : 45, ignore_this % C read_in_this** i : 45 c : C string[0-5] : "read_" string[5-14] : "in_this**" scanf() 는 4 를리턴

14 sprintf()/sscanf() 각각 printf() 와 scanf() 함수의문자열버전 함수원형 int sprintf(char *, const char *,...); int sscanf(const char *, const char *,...);

15 파일입출력의개념 파일은데이터를입출력하는모든대상을의미 키보드로부터데이터를입력하고모니터로출력하는것은키보드파일과모니터파일로데이터를입출력하는것임 프로그램은사실상스트림파일 (stream file) 이라고하는표준화된형태의파일로입출력을수행하고이파일이다시물리적인장치와연결되어실제적인입출력이수행됨

16 스트림파일을사용하는이유 입출력함수들이다양한입출력장치와독립적으로일관된입출력작업을해야한다 ( 입출력장치는항상변한다 ). 입력과출력을바이트 (byte) 들의흐름으로생각하는것

17 스트림파일을사용하는이유 프로그램에서데이터를처리하는속도와입출력장치에서수행되는입출력속도의차이를줄이는역할을한다. 하드디스크의처리속도는메모리의전기적처리속도를따라갈수없다. 스트림파일은버퍼 (buffer) 를사용하여속도차이를줄인다.

18 fopen() fopen 함수가개방에성공하면스트림파일을만들고파일포인터를리턴한다. 스트림파일은데이터를저장하는버퍼와버퍼를관리하는여러정보를파 일구조체변수에저장하고있는데이구조체변수의포인터가파일포이터 이다. struct _iobuf{ char *_ptr; int _cnt; char *_base; int _flag; int _file; int _charbuf; int _bufsize; char *tmpfname; ; typedef struct _iobuf FILE;

표준입출력스트림 기본적인스트림들은프로그래머가생성하지않아도자동으로생성된다. 이름스트림연결장치 stdin 표준입력스트림키보드 stdout 표준출력스트림모니터의화면 stderr 표준오류스트림모니터의화면

20 fopen() 파일포인터를포인터변수에저장하면입출력준비작업이끝난다. FILE *fp; fp = fopen( a.txt, w ); // FILE 구조체를가리키는포인터변수 // 파일포인터를포인터변수에저장한다. 파일개방에실패하면 fopen 함수는널포인터를리턴한다. - 널포인터를사용하면실행할때에러가발생하므로반드시개방에성공 했는지를검사해야한다. fp = fopen( b.txt, r ); if(fp == NULL){ printf( 파일이없습니다. ); return 1; // 읽기전용으로파일개방 // 파일이개방되지않았으면조건식은참 // 안내메시지를출력하고 // 프로그램을종료한다.

21 fopen() 스트림파일을만드는것을파일개방이라고하며 fopen 함수를사용하여수행한다. - 출력전용으로사용할파일을개방하는예 - 개방할파일은현재의작업디렉토리에서찾으며경로를직접지정할수도있다. fopen( c:\\source\\a.txt, w ); // 디렉토리를표시하는백슬래시는문자열안에있으므로두번사용한다.

22 fopen() fopen(filename, mode) 형태의함수호출은 filename 파일을 mode에지정된모드로열고, 파일포인터를리턴함

23 모드 모드 r 읽기모드로파일을연다. w a r+ 설명 쓰기모드로파일을생성한다. 만약파일이존재하지않으면파일이생성된다. 파일이이미존재하면기존의내용이지워진다. 추가모드로파일을연다. 만약똑같은이름의기존의파일이있으면데이터가파일의끝에추가된다. 파일이없으면새로운파일을만든다. 읽기모드로파일을연다. 쓰기모드로전환할수있다. 파일이반드시존재하여야한다. w+ 쓰기모드로파일을생성한다. 읽기모드로전환할수있다. 파일이존재하면기존의데이터가지워진다. a+ 추가모드로파일을연다. 읽기모드로전환할수있다. 데이터를추가하면 EOF 마커를추가된데이터의뒤로이동한다. 파일이없으면새로운파일을만든다. b 이진파일모드로파일을연다. 모드뒤의 + 는파일을읽기와쓰기로모두연다는것을의미함

24 fopen() 출력전용모드는같은이름의파일이있을때그내용을모두삭제 하고개방하므로주의해야한다. - 일단읽기전용모드로개방한후에파일존재여부를확인하고다시출력전용으로개방한다. ifp=fopen( a.txt, r ); if(ifp==null){ ofp=fopen( a.txt, w ); // 일단읽기전용으로개방한다. // 파일이없으면조건식은참 // 이때다시쓰기전용으로개방한다.

25 fopen()/fclose() 파일열기와닫기의전형적인예제코드 #include <stdio.h> int main(void){ int a, sum = 0; FILE *ifp, *ofp; ifp = fopen("my_file", "r"); ofp = fopen("outfile", "w");... fclose(ifp); fclose(ofp);

26 fopen()/fclose() #include <stdio.h> int main() { FILE *ifp, *ofp; ifp=fopen("a.txt", "r"); // a.txt 파일을읽기전용으로개방 if(ifp==null){ // 파일이없으면조건식은참 printf(" 입력파일이개방되지않았습니다.\n"); // 안내메시지출력 return 1; // 프로그램종료 printf(" 입력파일이개방되었습니다.\n"); ofp=fopen("b.txt", "w"); // b.txt 파일은쓰기전용으로개방한다. if(ofp==null){ printf(" 출력파일이개방되지않았습니다.\n"); return 1; printf(" 출력파일이개방되었습니다.\n"); return 0; // FILE 구조체에대한형선언이포함되어있다. // FILE 구조체포인터변수선언

27 fopen()/fclose() 사용이끝난파일은파일을닫아서스트림파일을제거한다. - 성공적으로닫으면 0 을리턴하며오류가발생하면 -1 을리턴한다. FILE *fp; int res; fp=fopen( a.txt, r ); res=fclose(fp); if(res!=0){ // fclose 함수의리턴값을저장할변수 // 파일개방 printf( 파일이닫히지않았습니다.\n ); return 1; // 파일포인터변수 fp 를전달인자로주고파일을닫는다. - 개방된파일은프로그램이종료되면자동으로닫히면서메모리에서제거되지만안정성을위해서명시적으로닫는것이좋다.

28 fprintf()/fscanf() 각각 printf() 와 scanf() 함수의파일버전 함수원형 int fprintf(file *fp, const char *format, ) int fscanf(file *fp, const char *format, ) fprintf(stdout,...); 와 printf(...); 는같은의미 fscanf(stdin,...); 은 scanf(...); 와같은의미

29 fprintf()/fscanf() fscanf, fprintf 함수는 scanf, printf 함수와사용법이같다. 단, 입출력 대상을파일포인터로지정해줄수있다. int fscanf(file *, char *, ); int fprintf(file *, char *, ); // 파일에서형식에따라데이터입력 // 파일로형식에따라데이터출력 - fscanf 함수는데이터의입력이끝나면 -1 을리턴한다. 예제 ) 이름, 나이, 키가저장된텍스트파일의데이터를형식에따라입 력한후에키, 나이, 이름의순서로출력하는예 텍스트파일 a.txt 박준성 25 188.9 지혜연 23 162.5 조충근 19 175.0 텍스트파일 b.txt 188.9 25 박준성 162.5 23 지혜연 175.0 19 조충근

30 fprintf()/fscanf() #include <stdio.h> int main() { FILE *ifp, *ofp; char name[20]; int age; double height; int res; ifp=fopen("a.txt", "r"); if(ifp==null){ printf(" 입력파일개방실패.\n"); return 1; ofp=fopen("b.txt", "w"); if(ofp==null){ printf(" 출력파일개방실패.\n"); return 1; while(1){ res=fscanf(ifp, "%s%d%lf", name, &age, &height); if(res==eof) break; fprintf(ofp, "%.1lf %d %s\n", height, age, name); fclose(ifp); fclose(ofp); return 0;

31 fputc() 문자하나를파일에출력할때는 fputc 함수를사용한다. - 첫번째전달인자로주어지는문자를두번째전달인자의파일로출력한다. 키보드로부터입력되는데이터를파일로출력하는예 #include <stdio.h> int main() { FILE *fp; char ch; fp=fopen("b.txt", "w"); if(fp==null){ printf(" 파일개방실패.\n"); return 1; printf(" 데이터를입력하세요.\n"); while(1){ ch=getchar(); if(ch==eof) break; fputc(ch, fp); fclose(fp); return 0; // 키보드입력 // 파일로출력 데이터를입력하세요. banana ( 엔터 ) apple ( 엔터 ) ^Z ( 입력종료 )

32 fgets() 문자열을한번에입력할때는 fgets 함수를사용한다. - 파일포인터와연결된파일로부터두번째전달인자로주어진바이트수에따라데이터를읽어와서첫번째전달인자로주어진배열에저장한다. - 5 바이트의크기를갖는배열에문자열을입력받는경우 FILE *fp; char str[5]; fp=fopen( a.txt, r ); 널문자가저장될공간을제외하고 4 바이트만입력된다.

33 fgets() fgets 함수는문자열입력에앞서줄단위로입력받는다. - 배열의크기가 10 바이트인경우의입력 ( 새줄문자도입력받는다 ). FILE *fp; char str[10]; fp=fopen( a.txt, r ); fgets(str, sizeof(str), fp); - 입력받은문자열에서새줄문자가불필요할때에는제거한다. str[strlen(str)-1] = 0 ; str 배열에서새줄문자가저장된위치의첨자가구해진다. strlen(str) 널문자전까지의바이트수 7 strlen(str) -1 6 새줄문자가저장된위치의첨자 str[strlen(str) -1] = 0 ; 새줄문자가널문자로바뀐다.

34 fgets() 입력받을데이터의수보다파일의크기가작으면파일끝까지읽어들 인다 ( 물론중간에새줄문자는없어야한다 ). char str[80]; fgets(str, sizeof(str), fp); 입력파일의데이터 monkey and tiger 입력파일의데이터가 80 바이트가안되므로파일끝까지입력된다! fgets 함수의리턴값을입력한배열의포인터이다. 따라서입력이끝난 후에바로이포인터를사용하여문자열을출력할수있다. printf( %s\n, fgets(str, sizeof(str), fp)); 입력파일에서더이상읽어들일데이터가없으면널포인터를리턴한다. (-1(EOF) 가아니므로주의한다!) res=fgets(str, sizeof(str), fp); if(res==null) break; // 파일의끝이면입력을종료한다.

35 fputs() 문자열을한번에출력할때는 fputs 함수를사용한다. int fputs(char *, FILE *); // 파일로문자열을출력한다. - 첫번째전달인자는출력할문자열의위치를주고두번째전달인자는파일포인터를준다 (puts 함수와는달리자동으로줄을바꾸지않는다 ). FILE *fp; char str[] = orange ; fp=fopen( b.txt, w ); // 파일포인터변수 // 출력할데이터가저장된배열, 초기화한다. // 파일을출력용으로개방 b.txt 파일 fputs ( str, fp ); orange 출력할배열의배열명 파일포인터

36 예제 #include <stdio.h> #include <string.h> int main() { FILE *ifp, *ofp; char str[80]; char *res; ifp=fopen("a.txt", "r"); if(ifp==null){ printf(" 입력파일개방실패.\n"); return 1; ofp=fopen("b.txt", "w"); if(ofp==null){ printf(" 출력파일개방실패.\n"); return 1; while(1){ res=fgets(str, sizeof(str), ifp); if(res==null) break; str[strlen(str)-1]='\0'; fputs(str, ofp); fputs(" ", ofp); fclose(ifp); fclose(ofp); return 0; 입력파일 a.txt 출력파일 b.txt 소년은 ( 엔터 ) 늙기쉽고 ( 엔터 ) 학문은 ( 엔터 ) 이루기어렵다. ( 엔터 ) 소년은늙기쉽고학문은이루기어렵다.

37 fflush() 입출력함수들이버퍼를공유하기때문에예상치못한문제가발생한다. - 학번을입력하고바로이름을입력하는예 int num; char name[20]; printf( 학번을입력하세요 : ); scanf( %d, &num); printf( 이름을입력하세요 : ); fgets(name, sizeof(name), stdin); 학번을입력하세요 : 315 ( 엔터 ) 이름을입력하세요 : 학번 : 315 이름 : scanf 함수가학번을입력받은후에버퍼에남겨진새줄문자를다음에 호출되는 fgets 함수가데이터로받아들이기때문이다. 키보드입력 315 ( 엔터 ) 스트림파일버퍼 3 1 5 n scanf 함수가정수값으로변환하여 num 변수에입력한다. fgets 함수는새줄문자를데이터로가져간다.

38 fflush() fflush 함수는버퍼에남아있는불필요한데이터를삭제한다. int fflush(file *); // 스트림파일의버퍼를비워준다. int num; char name[20]; printf( 학번을입력하세요 : ); scanf( %d, &num); fflush(stdin); // scanf 함수와 gets 함수가공유하는표준입력스트림버퍼를비운다. printf( 이름을입력하세요 : ); fgets(name, sizeof(name), stdin); 학번을입력하세요 : 315 ( 엔터 ) 이름을입력하세요 : 홍길동 ( 엔터 ) 학번 : 315 이름 : 홍길동

임의접근파일 순차접근 (sequential access) 방법 : 데이터를파일의처음부터순차적으로읽거나기록하는방법 임의접근 (random access) 방법 : 파일의어느위치에서든지읽기와쓰기가가능한방법 순차접근파일 임의접근파일

40 파일의임의의위치접근 ftell(file_ptr) 파일위치지시자의현재값을리턴 fseek(file_ptr, offset, place) 파일위치지시자를 place부터 offset 바이트떨어진곳을나타내는값으로설정함 place의값은 0(SEEK_SET), 1(SEEK_CUR), 2(SEEK_END) 중하나가될수있는데, 이것들은각각파일의처음, 현재위치, 파일의끝을나타냄

41 파일의임의의위치접근 파일을역으로출력하는프로그램 #include <stdio.h> int main(void){ char fname[100]; int c; FILE *ifp; fprintf(stderr, "\ninput a filename: "); scanf("%s", fname); ifp = fopen(fname, "rb"); fseek(ifp, 0, SEEK_END); fseek(ifp, -1, SEEK_CUR); while (ftell(ifp) > 0) { c = getc(ifp); putchar(c); fseek(ifp, -2, SEEK_CUR) ; return 0;

정리파일의기초 파일 (File) : 프로그램에서사용할데이터를보조기억장치에저장한데이터들의집합 ( 예 ) 문서, 소리, 그림, 동영상등과같은모든종류의자료 텍스트파일 1 한글을제외한모든문자를 ASCII 코드로표현 2 일반적으로문서파일이며, 아무연산없이읽을수있는문자가들어있는파일 3 각라인은라인의끝을표시하는문자로종료 4 순차적으로입출력할수있지만랜덤입출력불가 이진파일 1 ASCII 코드가아닌 2 진수의형태로저장하는모든파일 2 문자가아닌이진데이터로저장된파일 3 모든데이터들은변환없이입출력되고, 라인을분리하지않음 4 실행파일, 사운드파일, 그래픽파일등은이진파일 5 랜덤하게읽거나쓰기가능

버퍼 (buffer) 데이터를일정량저장할수있는메모리공간 키보드를통해데이터를입력하면 [Enter] 키를누를때까지스트림을통해입력버퍼에보관하다가 [Enter] 키를누르면입력버퍼의내용들을실행중인프로그램으로전달

C 언어는파일을열어더이상읽을데이터가없으면 텍스트파일의끝 을의미하는 EOF(End Of File) 을반환 EOF 는 stdio.h 헤더파일에다음과같이정의 #define EOF (-1) DOS 에서는 [Ctrl]+[Z] 키를누르면 EOF 문자로인식 UNIX 나 LINUX 에서는 [Ctrl]+[C] 키를누르면 EOF 문자로인식 이진파일일경우에는파일의끝이라는의미로사용되지않고일반데이터로처리됨 텍스트파일과이진파일에서는 feof( ) 함수를사용하여파일의끝 ( 파일의끝에도달하면 0 이아닌값을리턴 ) 확인가능

파일에데이터입출력을위한작성순서 1 파일명대신파일포인터를사용 FILE * 파일포인터 ; 2 파일을읽기와쓰기중어떤용도로사용할것인지를결정하여 모드 에기술하고파일을열기 파일포인터 = fopen(" 파일명, 모드 ); 3 파일처리 : 파일입출력 4 파일닫기 : fclose( 파일포인터변수 ); FILE 구조체는 stdio.h 헤더파일에선언 스트림에접근하기위한자료구조로각스트림마다자신만의 FILE 구조체를갖음

텍스트파일입출력함수 fgetc( ), getc( ), getchar( ) 함수 : unsigned char 타입으로읽은문자를 int 타입으로반환, 파일의끝이면 EOF, 에러가발생하면에러값을반환 gets( ) 와 fgets( ) 함수 : 성공하면문자열의포인터를반환, 파일의끝이거나에러가발생한경우또는아무런문자도입력받지못하면 EOF 를반환

47

예제 1 #include <stdio.h> #include <string.h> int main(void) { FILE *fp; char fname[128]; char buffer[256]; char word[256]; int line_num = 0; printf(" 입력파일이름을입력하시오 : "); scanf("%s", fname); printf(" 탐색할단어를입력하시오 : "); scanf("%s", word); proverb.txt A chain is only as strong as its weakest link A change is as good as a rest A fool and his money are soon parted A friend in need is a friend indeed A good beginning makes a good ending A little knowledge is a dangerous thing

// 파일을읽기모드로연다. if( (fp = fopen(fname, "r")) == NULL ) { fprintf(stderr," 파일 %s 을열수없습니다.\n", fname); exit(1); while( fgets(buffer, 256, fp) ) { line_num++; if( strstr(buffer, word) ) { printf("%s: %d 단어 %s 이발견되었습니다.\n", fname, line_num, word ); fclose(fp); return 0; 입력파일이름을입력하시오 : proverb.txt 탐색할단어를입력하시오 : house proverb.txt: 7 단어 house 이발견되었습니다. proverb.txt: 8 단어 house 이발견되었습니다.

예제 2. 성적파일입출력 int main(void) { FILE *fp; char fname[100]; int number, count = 0; char name[20]; float score, total = 0.0; printf(" 성적파일이름을입력하시오 : "); scanf("%s", fname); // 성적파일을쓰기모드로연다. if( (fp = fopen(fname, "w")) == NULL ) { fprintf(stderr," 성적파일 %s 을열수없습니다.\n", fname); exit(1);

// 사용자로부터학번, 이름, 성적을입력받아서파일에저장한다. while( 1 ) { printf(" 학번, 이름, 성적을입력하시요 : ( 음수이면종료 )"); scanf("%d", &number); if( number < 0 ) break scanf("%s %f", name, &score); fprintf(fp, "%d %s %f\n", number, name, score); fclose(fp); // 성적파일을읽기모드로연다. if( (fp = fopen(fname, "r")) == NULL ) { fprintf(stderr," 성적파일 %s 을열수없습니다.\n", fname); exit(1);

// 파일에서성적을읽어서평균을구한다. while(!feof( fp ) ) { fscanf(fp, "%d %s %f", &number, name, &score); total += score; count++; printf(" 평균 = %f\n", total/count); fclose(fp); return 0; 성적파일이름을입력하시오 : score.txt 학번, 이름, 성적을입력하시요 : ( 음수이면종료 ) 1 KIM 90.2 학번, 이름, 성적을입력하시요 : ( 음수이면종료 ) 2 PARK 30.5 학번, 이름, 성적을입력하시요 : ( 음수이면종료 ) 3 MIN 56.8 학번, 이름, 성적을입력하시요 : ( 음수이면종료 )-1 평균 = 58.575001

예제 3. 임의접근파일 #include <stdio.h> #include <stdlib.h> #define SIZE 1000 void init_table(int table[], int size); int main(void) { int table[size]; int n, data; long pos; FILE *fp = NULL; // 배열을초기화한다. init_table(table, SIZE); // 이진파일을쓰기모드로연다. if( (fp = fopen("sample.dat", "wb")) == NULL ) { fprintf(stderr," 출력을위한파일을열수없습니다.\n"); exit(1);

// 배열을이진모드로파일에저장한다. fwrite(table, sizeof(int), SIZE, fp); fclose(fp); // 이진파일을읽기모드로연다. if( (fp = fopen("sample.dat", "rb")) == NULL ) { fprintf(stderr," 입력을위한파일을열수없습니다.\n"); exit(1); // 사용자가선택한위치의정수를파일로부터읽는다. while(1) { printf(" 파일에서의위치를입력하십시요 (0 에서 %d, 종료 -1): ", SIZE - 1); scanf("%d", &n); if( n == -1 ) break pos = (long) n * sizeof(int); fseek(fp, pos, SEEK_SET); fread(&data, sizeof(int), 1, fp); printf("%d 위치의값은 %d 입니다.\n", n, data); fclose(fp); return 0;

// 배열을인덱스의제곱으로채운다. void init_table(int table[], int size) { int i; for(i = 0; i < size; i++) table[i] = i * i; 파일에서의위치를입력하십시요 (0 에서 999, 종료 -1): 3 3 위치의값은 9 입니다. 파일에서의위치를입력하십시요 (0 에서 999, 종료 -1): 9 9 위치의값은 81 입니다. 파일에서의위치를입력하십시요 (0 에서 999, 종료 -1): -1

56

Adv. 1 사용자로부터직원에대한정보를받아서 employee.txt 파일에저장하는프로그램을작성하시오.

Prgoram #include <stdio.h> int main(void) { FILE *fptr; char name[20]; int age; float salary; fptr = fopen ("employee.txt", "w"); if (fptr == NULL) { printf(" 파일을생성할수없음!\n"); return; printf(" 직원이름 : "); scanf("%s", name); fprintf(fptr, " 이름 = %s\n", name); printf(" 나이 : "); scanf("%d", &age); fprintf(fptr, " 나이 = %d\n", age); printf(" 월급 : "); scanf("%f", &salary); fprintf(fptr, " 월급 = %f\n", salary); fclose(fptr); return 0;

Adv. 2 정수들이저장된파일에서모든정수를읽어서정수의개수, 합계, 평균을출력하는프로그램을작성하시오.

Prgoram 2-1 #include <stdio.h> int main (void) { int number, sum, count; double average; FILE *in, *f; char ch; f=fopen("numbers","w"); printf(" 정수들을입력하고 ctrl+z 를누른다.\n"); do { ch=getchar(); putc(ch,f); while(ch!=eof); fclose(f); in = fopen ("numbers", "r"); sum = 0; count = 0;

Prgoram2-2 while (fscanf (in, "%d", &number) == 1) { sum = sum + number; count = count + 1; fclose (in); printf (" 정수들의개수 : %d\n", count); printf (" 정수들의합계 : %d\n", sum); average = (double)sum / count; printf (" 정수들의평균 : %5.2lf\n", average); return (0);

참고문헌 열혈 C 프로그래밍, 윤성우, 오렌지미디어 쉽게풀어쓴 C 언어 Express, 천인국, 생능출판사 뇌를자극하는 C 프로그래밍, 서현우, 한빛미디어 쾌도난마 C 프로그래밍, 강성수, 북스홀릭 C 프로그래밍기초와응용실습, 고응남, 정익사 62

63