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

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

슬라이드 1

Microsoft PowerPoint - chap06-1Array.ppt

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

PowerPoint 프레젠테이션

Microsoft PowerPoint - chap06-2pointer.ppt

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

歯9장.PDF

<4D F736F F F696E74202D2034C5D8BDBAC6AEC6C4C0CFC0D4C3E2B7C2312E505054>

chap7.key

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

Microsoft PowerPoint - chap4 [호환 모드]

Microsoft PowerPoint - Chap14_FileAccess.pptx

Microsoft PowerPoint - 제11강 파일 처리

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

C Programming

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

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

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

슬라이드 1

Microsoft PowerPoint APUE(Intro).ppt

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

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

PowerPoint Template

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

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

설계란 무엇인가?

제1장 Unix란 무엇인가?

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

Microsoft PowerPoint - chap06-8.ppt

Microsoft PowerPoint - chap09-1.ppt

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

Microsoft PowerPoint 웹 연동 기술.pptx

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

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

PowerPoint 프레젠테이션

OCW_C언어 기초

PowerPoint Presentation

제1장 Unix란 무엇인가?

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

C 프로그램의 기본

Microsoft PowerPoint - [2009] 02.pptx

Microsoft PowerPoint - chap08-1 [호환 모드]

Microsoft PowerPoint - 10_C_Language_Text_Files

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

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures

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

11장 포인터

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

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

<4D F736F F F696E74202D20C1A633C0E52043C7C1B7CEB1D7B7A5B1B8BCBABFE4BCD2>


KNK_C_05_Pointers_Arrays_structures_summary_v02

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

02장.배열과 클래스

Microsoft PowerPoint - 제9강 문자열

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

PowerPoint 프레젠테이션

C++ Programming

Microsoft PowerPoint - Lesson13.pptx

Microsoft PowerPoint - chap1 [호환 모드]

Microsoft PowerPoint - 08-C-App-19-Quick-Preprocessor

기초컴퓨터프로그래밍

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

Microsoft PowerPoint - C_Programming_Basics.ppt [호환 모드]

chap 5: Trees

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

< E20C6DFBFFEBEEE20C0DBBCBAC0BB20C0A7C7D12043BEF0BEEE20492E707074>

쉽게 풀어쓴 C 프로그래밍

11장 포인터

구조체정의 자료형 (data types) 기본자료형 (primitive data types) : char, int, float 등과같이 C 언어에서제공하는자료형. 사용자정의자료형 (user-defined data types) : 다양한자료형을묶어서목적에따라새로운자료형을

Lab 3. 실습문제 (Single linked list)_해답.hwp

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

임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과

본 강의에 들어가기 전

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

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

PowerPoint 프레젠테이션

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

제7장 C 표준 파일 입출력

A Dynamic Grid Services Deployment Mechanism for On-Demand Resource Provisioning

제7장 C 표준 파일 입출력

Chapter 4. LISTS

슬라이드 1

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C D616E2E637070>

Microsoft PowerPoint - 10장 문자열 pptx

쉽게 풀어쓴 C 프로그래밍

PowerPoint 프레젠테이션

C 언어와 프로그래밍 개요

본 강의에 들어가기 전

Microsoft PowerPoint - ch07 - 포인터 pm0415

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CC0E7B0EDB0FCB8AE5C53746F636B5F4D616E D656E74732E637070>

03 상수, 변수, 자료형

BMP 파일 처리

프로그램의실행화면 주석 (comment) 두수의합 : 300 /* 두개의숫자의합을계산하는프로그램 */ 주석은코드를설명하는글입니다. 주석 3 가지방법의주석 주석의예 /* 한줄로된주석 */ /* 저자 : 홍길동날짜 : 2013.

11장 포인터

Microsoft PowerPoint - chap-03.pptx

YRRZBRRLMCEQ.hwp

Microsoft PowerPoint - chap05-제어문.pptx

Transcription:

chapter 11-1 참고자료. 파일입출력 박종혁 Tel: 970-6702 Email: jhpark1@snut.ac.kr k 한빛미디어 출처 : 뇌를자극하는 C프로그래밍, 한빛미디어 -1- ehanbit.net

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

스트림파일을사용하는이유 입출력함수들이다양한입출력장치와독립적으로일관된입출력 작업을해야한다 ( 입출력장치는항상변한다 ). 프로그램에서데이터를처리하는속도와입출력장치에서수행되는 입출력속도의차이를줄이는역할을한다. - 하드디스크의처리속도는메모리의전기적처리속도를따라갈수없다. - 스트림파일은버퍼 (buffer) 를사용하여속도차이를줄인다. 한빛미디어 -3- ehanbit.net

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

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

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

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

개방모드 파일은사용용도에맞게적절한모드로개방한다. 개방모드파일이있을때파일이없을때 r 읽기위해개방널포인터리턴 w 파일의내용을삭제하고쓰기위해개방새로운파일생성 a 파일의끝에추가하기위해개방새로운파일생성 출력전용모드는같은이름의파일이있을때그내용을모두삭제하고개방하므로주의해야한다. - 일단읽기전용모드로개방한후에파일존재여부를확인하고다시출력전용으로개방한다. ifp=fopen( a.txt, r ); if(ifp==null){ ofp=fopen( a.txt, w ); // 일단읽기전용으로개방한다. // 파일이없으면조건식은참 // 이때다시쓰기전용으로개방한다. 한빛미디어 -8- ehanbit.net

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

파일입출력과정 파일개방이끝나면파일포인터로해당파일에입출력을할수있다. 파일로부터하나의문자를입력하는예 (fgetc 함수 ) #include <stdio.h> int main() { FILE *fp; char ch; fp=fopen("a.txt", "r"); if(fp==null){ printf(" 파일개방실패. n"); return 1; ch=fgetc(fp); printf(" 입력한문자 : %c n", ch); fclose(fp); return 0; 입력한문자 : a 출력결과 한빛미디어 -10- ehanbit.net

파일로부터데이터가입력되는과정 입력함수가처음호출되면파일로부터버퍼크기만큼의데이터를 한번에버퍼로읽어들인다. 그이후에호출되는입력함수는버퍼에데이터가없을때까지버퍼로부터데이터를입력한다. ch=fgetc(fp); printf( 입력받은문자 : %c n, ch); // a 출력 ch=fgetc(fp); // 두번째호출될때는버퍼로부터데이터를입력한다. printf( 입력받은문자 : %c n, ch); // p 출력 한빛미디어 -11- ehanbit.net

파일로부터데이터가입력되는과정 버퍼로부터의입력위치는 FILE 구조체의멤버인위치지시자로확인한다. 위치지시자의값이파일의크기와같아지면데이터를모두읽은것이되며이때입력함수는 -1을리턴한다 ( 이값은보통 EOF로기호화한다 ). 한빛미디어 -12- ehanbit.net

파일의내용을읽어서화면에출력하는예 #include <stdio.h> int main() { FILE *fp; char ch; fp=fopen("a.txt", "r"); if(fp==null){ printf(" 파일개방실패. n"); return 1; while(1){ ch=fgetc(fp); if(ch==eof) break; putchar(ch); fclose(fp); return 0; // 무한반복 // 개방한파일로부터한문자를입력한다. // 리턴값이 -1(EOF) 이면파일의끝이므로반복종료 // 읽어들인문자를화면에출력한다. // 파일을닫는다. 한빛미디어 -13- ehanbit.net

하나의문자를파일에출력하자 (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 ( 입력종료 ) 한빛미디어 -14- ehanbit.net

출력과정에서도버퍼를사용한다. fputc 함수가문자를출력할때도 fgetc 함수와마찬가지로개방된 스트림파일의버퍼를사용한다. - 한문자를출력할때마다일단버퍼에출력이된후에새줄문자가출력되면하드디스크의파일로출력된다. 한빛미디어 -15- ehanbit.net

기본적으로개방되는표준입출력스트림파일 프로그램이실행될때기본적으로개방되는스트림파일있다. 스트림파일의이름 스트림파일의용도 연결된입출력장치 stdin 표준입력스트림 키보드 stdout 표준출력스트림 모니터 stderr 표준에러스트림 모니터 - 지금까지파일포인터의사용없이입출력한함수들은기본개방스트림파일을이용하는것이다 (getchar함수가키보드로부터문자를입력하는예 ). 한빛미디어 -16- ehanbit.net

기본적으로개방되는표준입출력스트림파일 stdin, stdout, stderr 은파일포인터를기호화한것이다. - 이들파일포인터를사용하면 fgetc, fputc 함수도키보드나, 모니터로 입출력이가능하다. 한빛미디어 -17- ehanbit.net

표준입출력스트림을사용하는프로그램예 #include <stdio.h> int main() { char ch; while(1){ ch=fgetc(stdin); if(ch==eof) break; fputc(ch, stdout); return 0; 출력결과 // stdin 과연결된키보드로부터데이터를입력받는다. // stdout 과연결된모니터로데이터를출력한다. stream ( 엔터 ) stream ^Z // 키보드입력 // 화면출력 // 입력종료 한빛미디어 -18- ehanbit.net

다양한입출력함수 파일입출력함수에는필요에따라적절히사용할수있는다양한 함수가있다. 문자열을한번에입출력하는함수 : fgets, fputs 다양한자료형맞게입출력하는함수 : fscanf, fprintf 스트림파일의버퍼를비워주는함수 : fflush 한빛미디어 -19- ehanbit.net

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

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

문자열을한번에입력하자 (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; // 파일의끝이면입력을종료한다. 한빛미디어 -22- ehanbit.net

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

여러줄의문장을한줄로출력하는프로그램 #include <stdio.h> #include <string.h> int main() { FILE *ifp, *ofp; char str[80]; char *res; ifp=fopen("a.txt", fopen( "r"); 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 소년은 ( 엔터 ) 늙기쉽고 ( 엔터 ) 학문은 ( 엔터 ) 이루기어렵다. ( 엔터 ) 소년은늙기쉽고학문은이루기어렵다. 한빛미디어 -24- ehanbit.net

gets, puts 대신 fgets, fputs 함수를사용하자. gets 함수는데이터를입력할때할당되지않은기억공간을침범할가능성이있다. char str[10]; gets(str); // 사용자가 10 바이트를넘는데이터를입력하면문제가발생한다! puts 함수는항상줄을바꿔주므로문자열을출력한후에바로입력하는경우에사용이불가능하다. int age; puts( 나이를입력하세요 : ); scanf( %d, &age); 나이를입력하세요 : // 항상다음줄에서입력한다. stdin, stdout 을파일포인터로사용하여 fgets, fputs 함수를사용한다. fgets(str, sizeof(str), stdin); fputs(str, stdout); // 모니터로문자열을출력한다. // 키보드로부터문자열을입력한다. 한빛미디어 -25- ehanbit.net

다양한자료형에맞게입출력하자 (fscanf, fprintf) 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 조충근 한빛미디어 -26- ehanbit.net

fscanf, fprintf 함수를사용한프로그램예 #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", f " "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; 한빛미디어 -27- ehanbit.net

스트림파일의버퍼를비운다 (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 함수는새줄문자를데이터로가져간다. 한빛미디어 -28- ehanbit.net

스트림파일의버퍼를비운다 (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 이름 : 홍길동 한빛미디어 -29- ehanbit.net