제1장 Unix란 무엇인가?

Similar documents
chap7.key

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

Microsoft PowerPoint - chap4 [호환 모드]

제7장 C 표준 파일 입출력

제7장 C 표준 파일 입출력

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

<4D F736F F F696E74202D2034C5D8BDBAC6AEC6C4C0CFC0D4C3E2B7C2312E505054>

Microsoft PowerPoint - 제11강 파일 처리

PowerPoint Template

제1장 Unix란 무엇인가?

歯9장.PDF

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

제12장 파일 입출력

슬라이드 1

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

C Programming

Microsoft PowerPoint - Chap14_FileAccess.pptx

Microsoft PowerPoint APUE(Intro).ppt

PowerPoint 프레젠테이션

Microsoft PowerPoint - chap1 [호환 모드]

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

Microsoft PowerPoint - 10_C_Language_Text_Files

Microsoft PowerPoint - Lesson13.pptx

BMP 파일 처리

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

제1장 Unix란 무엇인가?

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

11장 포인터

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

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

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

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C D616E2E637070>

ABC 11장

Microsoft PowerPoint - [2009] 02.pptx

Microsoft PowerPoint APUE(File InO).pptx

설계란 무엇인가?

Microsoft PowerPoint - Lecture 4-1 Linux File Environment.ppt [호환 모드]

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

untitled

Computer Programming (2008 Fall)

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

2009년 상반기 사업계획

PowerPoint 프레젠테이션

슬라이드 1

<4D F736F F F696E74202D FC6C4C0CF20C0D4C3E2B7C2205BC8A3C8AF20B8F0B5E55D>

The Pocket Guide to TCP/IP Sockets: C Version

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

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

쉽게 풀어쓴 C 프로그래밍

제1장 Unix란 무엇인가?

Microsoft PowerPoint - chap06-2pointer.ppt

Microsoft PowerPoint APUE(File InO).ppt

Microsoft PowerPoint - 제9강 문자열

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

PowerPoint 프레젠테이션

C 프로그램의 기본

PowerPoint 프레젠테이션

2007_2_project4

본 강의에 들어가기 전

Microsoft PowerPoint APUE(File InO)


Microsoft PowerPoint - 11_C_Language_C_Standard_Library

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

< E20C6DFBFFEBEEE20C0DBBCBAC0BB20C0A7C7D12043BEF0BEEE20492E707074>

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C4C656D70656C2D5A69762E637070>

11장 포인터

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

Microsoft PowerPoint - Ch12.파일.pptx

PowerPoint Presentation

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

03 상수, 변수, 자료형

슬라이드 1

슬라이드 1

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

<4D F736F F F696E74202D20C1A63136C0E520C6C4C0CFC0D4C3E2B7C2>

PowerPoint 프레젠테이션

OCW_C언어 기초

PowerPoint 프레젠테이션

The Pocket Guide to TCP/IP Sockets: C Version

학번 : 이름 : 1. 다음파일트리구조를가진유닉스시스템이있다고가정하자. / /bin/ /home/ /home/taesoo/ /usr/ /usr/lib/ /usr/local/lib /media 모든폴더에파일이하나도없다고가정했을때사용자가터미널에서다음 ls 명령입력시화면출력

API 매뉴얼

11장 포인터

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

PowerPoint 프레젠테이션

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

Microsoft PowerPoint - chap2

<4D F736F F F696E74202D FB8DEB8F0B8AE20B8C5C7CE205BC8A3C8AF20B8F0B5E55D>

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

12 장파일입출력 파일입출력의기초파일열기, 사용하기, 닫기파일입출력모드문자단위파일입출력텍스트파일과이진파일 read, write 함수에의한이진파일입출력임의접근입출력스트림상태입출력연산자오버로딩과파일입출력 C++ 프로그래밍입문

ABC 11장

The Pocket Guide to TCP/IP Sockets: C Version

Microsoft PowerPoint - Lecture_Note_7.ppt [Compatibility Mode]

2009년 상반기 사업계획

Chapter_06

1장. 유닉스 시스템 프로그래밍 개요

<4D F736F F F696E74202D D20B9AEC0DABFAD2C20BDBAC6AEB8B2B0FA20C6C4C0CF20C0D4C3E2B7C2>


<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

PowerPoint 프레젠테이션

Transcription:

7 장 C 표준파일입출력 컴퓨터과학과박환수 1

2 7.1 파일및파일포인터

시스템호출과 C 라이브러리함수 시스템호출 (System Calls) Unix 커널에서비스요청하는호출 UNIX man의 Section 2에설명되어있음 C 함수처럼호출될수있음. C 라이브러리함수 (Library Functions) C 라이브러리함수는보통시스템호출을포장해놓은함수 보통내부에서시스템호출을함 1975년에 Dennis Ritchie에의해작성 ANSI C Standard Library 3

시스템호출 (system call) 시스템호출은커널에서비스요청을위한프로그래밍인터페이스 응용프로그램은시스템호출을통해서커널에서비스를요청한다. 4

파일 C 프로그램에서파일은왜필요할까? 변수에저장된정보들은실행이끝나면모두사라진다. 정보를영속적으로저장하기위해서는파일에저장해야한다. 유닉스파일 모든데이터를연속된바이트형태로저장한다. 5

C 언어의파일종류 텍스트파일 (text file) 사람들이읽을수있는문자들을저장하고있는파일 텍스트파일에서 한줄의끝 을나타내는표현은파일이읽어들여질때, C 내부의방식으로변환된다. 이진파일 (binary file) 모든데이터는있는그대로바이트의연속으로저장 이진파일을이용하여메모리에저장된변수값형태그대로파일에저장할수있다. 6

파일입출력 C 언어의파일입출력과정 1. 파일열기 : fopen( ) 함수사용 2. 파일입출력 : 다양한파일입출력함수사용 3. 파일닫기 : fclose( ) 함수사용 7

파일열기 파일을사용하기위해서는 반드시먼저파일열기 (fopen) 를해야한다. 파일열기를하면 FILE 구조체에대한포인터가리턴되며 FILE 포인터는열린파일을나타낸다. 함수 fopen() FILE *fopen(const char *filename, const char *mode); const char *filename: 파일명에대한포인터 const char *mode: 모드로파일을여는형식 예 FILE *fp; fp = fopen( ~/sp/text.txt", "r"); if (fp == NULL) { printf(" 파일열기오류 \n"); } 예 fp = fopen("outdata.txt", "w"); fp = fopen("outdata.txt", "a"); 8

fopen (): 텍스트파일열기 모드의미파일이없으면파일이있으면 "r" 읽기전용 (read) NULL 반환 정상동작 "w" 쓰기전용 (write) 새로생성 기존내용삭제 "a" 추가쓰기 (append) 새로생성 기존내용뒤에추가 "r+" 읽기와쓰기 NULL 반환 정상동작 "w+" 읽기와쓰기 새로생성 기존내용삭제 "a+" 추가를위한읽기와쓰기 새로생성 기존내용뒤에추가 9

FILE 구조체 파일관련시스템호출 파일디스크립터 (file descriptor) C 표준입출력함수 fopen( ) 함수로파일을열면 FILE 포인터 (FILE *) 가리턴됨 열린파일을가리키는 FILE 구조체에대한포인터 FILE 포인터를표준입출력함수들의인수로전달해야함 #include <stdio.h> FILE 구조체 하나의스트림에대한정보를포함하는구조체 버퍼에대한포인터, 버퍼크기 파일디스크립터 10

FILE 구조체 FILE 구조체 : 열린파일의현재상태를나타내는필드변수들특히파일입출력에사용되는버퍼관련변수들 typedef struct { int cnt; // 버퍼의남은문자수 unsigned char*base; // 버퍼시작 unsigned char*ptr; // 버퍼의현재포인터 unsinged flag; // 파일접근모드 ( _IOFBF, _IOLBF, _IONBUF, // _IOEOF, _IOERR _IOREAD, _IOWRT) int fd; // 열린파일디스크립터 } FILE; // FILE 구조체 11

표준입력 / 출력 / 에러 표준 I/O 스트림 (stream) 프로그램이시작되면자동으로 open되는스트림 stdin, stdout, stderr FILE* #include <stdio.h> 표준입출력포인터 설명 가리키는장치 stdin 표준입력에대한 FILE 포인터키보드 stdout 표준출력에대한 FILE 포인터모니터 stderr 표준오류에대한 FILE 포인터모니터 12

파일닫기 파일을열어서사용한후에는파일을닫아야한다. int fclose(file *fp ); fp는 fopen 함수에서받았던포인터 닫기에성공하면 0, 오류일때는 EOF( -1) 를리턴한다. 예 fclose(fp);

7.2 텍스트파일

파일입출력함수 표준입출력함수 파일입출력함수 기능 getchar() fgetc(), getc() 문자단위로입력하는함수 putchar() fputc(), putc() 문자단위로출력하는함수 gets() fgets() 문자열을입력하는함수 puts() fputs() 문자열을출력하는함수 scanf() fscanf() 자료형에따라자료를입력하는함수 printf() fprintf() 자료형에따라자료를출력하는함수

문자단위입출력 fgetc() 함수와 fputc() 함수 파일에문자단위입출력을할수있다. int fgetc(file *fp); getc 함수는 fp 가지정한파일에서한문자를읽어서리턴한다. 파일끝에도달했을경우에는 EOF(-1) 를리턴한다. int fputc(int c, FILE *fp); putc 함수는파일에한문자씩출력하는함수 리턴값으로출력하는문자리턴 출력시오류가발생하면 EOF(-1) 리턴 16

cat.c 17

copy.c 18

copy.c 19

기타파일관련함수 int feof(file *fp) 파일포인터 fp 가파일의끝을탐지하면 0 이아닌값을리턴하고파일끝이면 0 을리턴한다. int ungetc(int c, FILE *p) c 에저장된문자를입력스트림에반납한다. 마치문자를읽지않은것처럼파일위치지정자를 1 감소시킨다. int fflush(file *fp) 아직기록되지않고버퍼에남아있는데이터를 fp 가가리키는출력파일에보낸다. 버퍼비우기기능을수행하는함수이다. 20

줄단위입출력 fgets() 함수와 fputs() 함수 텍스트파일에서한줄씩읽거나쓸수있다. char* fgets(char *s, int n, FILE *fp); 파일로부터한줄을읽어서문자열포인터 s 에저장하고 s 를리턴 개행문자 ('\n') 나 EOF 를만날때까지파일로부터최대 n-1 개의문자를읽고읽어온데이터의끝에는 NULL 문자를붙여준다. 파일을읽는중파일끝혹은오류가발생하면 NULL 포인터리턴. int fputs(const char *s, FILE *fp); 문자열 s를파일포인터 fp가가리키는파일에출력 성공적으로출력한경우에는출력한바이트수를리턴 출력할때오류가발생하면 EOF 값을리턴 21

line.c 22

line.c 23

포맷입출력 fprintf() 함수 printf() 함수와같은방법으로파일에데이터를출력할수있다. fscanf() 함수 scanf() 함수와같은방법으로파일로부터데이터를읽어들일수있다. int fprintf(file *fp, const char *format,...); fprintf 함수의첫번째인수 fp 는츨력할파일에대한 FILE 포인터 두번째부터의인수는 printf 함수와동일 int fscanf(file *fp, const char *format,...); fscanf 함수의첫번째인수 fp 는입력받을파일에대한 FILE 포인터 두번째부터의인수는 scanf 함수와동일 24

fprint.c 25

fscan.c 26

7.3 이진파일

fopen(): 이진파일열기 모드의미파일이없으면파일이있으면 "rb" 읽기전용 (read) NULL 반환 정상동작 "wb" 쓰기전용 (write) 새로생성 기존내용삭제 "ab" 추가쓰기 (append) 새로생성 기존내용뒤에추가 "rb+" 읽기와쓰기 NULL 반환 정상동작 "wb+" 읽기와쓰기 새로생성 기존내용삭제 "ab+" 추가를위한읽기와쓰기 새로생성 기존내용뒤에추가 28

블록단위입출력 fread() 와 fwrite() 한번에일정한크기의데이터를파일에읽거나쓰기위한입출력함수 int fread(void *buf, int size, int n, FILE *fp); fp 가가리키는파일에서 size 크기의블록 ( 연속된바이트 ) 을 n 개읽어서버퍼포인터 buf 가가리키는곳에저장 읽어온블록의개수를리턴 int fwrite(const void *buf, int size, int n, FILE *fp); 파일포인터 fp 가지정한파일에버퍼 buf 에저장되어있는 size 크기의블록 ( 연속된바이트 ) 을 n 개기록 성공적으로출력한블록개수를리턴 29

fwrite() 함수 30

블록입출력 기본아이디어 어떤자료형의데이터이던지그데이터를연속된바이트로해석해서파일에저장 파일에저장된데이터를연속된바이트형태로읽어서원래변수에순서대로저장하여원래데이터를그대로복원 예 : rec 저장 struct student rec; FILE *fp = fopen( stfile", "wb"); fwrite(&rec, sizeof(rec), 1, fp); 31

stcreate1. c student.h 32

fread() 함수 33

stprint.c 34

stprint.c 35

7.4 임의접근 36

파일내위치 현재파일위치 (current file position) 열린파일에서다음읽거나기록할파일내위치 파일위치포인터 (file position pointer) 시스템내에그파일의현재파일위치를저장하고있다. 37

파일위치관련함수 fseek(file *fp, long offset, int mode) 파일위치포인터를임의로설정할수있는함수 rewind(file *fp) 현재파일위치를파일시작에위치시킴. ftell(file *fp) 파일의현재파일위치를나타내는파일위치지정자값리턴 38

fseek() 함수 fseek(file *fp, long offset, int mode) FILE 포인터 fp 가가리키고파일의파일위치를 모드 (mode) 기준으로오프셋 (offset) 만큼옮긴다. 기호 값 의미 SEEK_SET 0 파일시작 SEEK_CUR 1 현재위치 SEEK_END 2 파일끝 39

fseek() 함수 파일위치이동 fseek(fd, 0L, SEEK_SET); 파일시작으로이동 (rewind) fseek(fd, 100L, SEEK_SET); 파일시작에서 100 바이트위치로 fseek(fd, 0L, SEEK_END); 파일끝으로이동 (append) 레코드단위로이동 fseek(fd, n * sizeof(record), SEEK_SET); n+1 번째레코드시작위치로 fseek(fd, sizeof(record), SEEK_CUR); 다음레코드시작위치로 fseek(fd, -sizeof(record), SEEK_CUR); 전레코드시작위치로 파일끝이후로이동 fseek(fd, sizeof(record), SEEK_END); 파일끝에서한레코드다음위치로이동 40

파일끝이후로이동 : 예 fwrite(&record1, sizeof(record), 1, fp); fwrite(&record2, sizeof(record), 1, fp); fseek(fd, sizeof(record), SEEK_END); fwrite(&record3, sizeof(record), 1, fp); 레코드 #1 레코드 #2 레코드 #3 41

stcreate2.c 42

stcreate2.c 43

stquery.c 44

stquery.c 45

레코드수정과정 (1) 파일로부터해당레코드를읽어서 (2) 이레코드를수정한후에 (3) 수정된레코드를다시파일내의원래위치에써야한다. 46

stupdate.c 47

stupdate.c 48

49 7.5 버퍼링

C 라이브러리버퍼 C 라이브러리버퍼사용목적 디스크 I/O 수행의최소화 read (), write () 함수호출의최소화 최적의크기단위로 I/O 수행 시스템성능향상 C 라이브러리버퍼방식 완전버퍼 (fully buffered) 방식 줄버퍼 (line buffered) 방식 버퍼미사용 (unbuffered) 방식 50

C 라이브러리버퍼방식 완전버퍼방식 버퍼가꽉찼을때실제 I/O 수행 디스크파일입출력 줄버퍼방식 줄바꿈문자 (newline) 에서실제 I/O 수행 터미널입출력 (stdin, stdout) 버퍼미사용방식 버퍼를사용하지않는다. 표준에러 (stderr) 51

buffer.c #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { FILE *fp; if (!strcmp(argv[1], "stdin")) { fp = stdin; printf(" 한글자입력 :"); if (getchar() == EOF) perror("getchar"); } else if (!strcmp(argv[1], "stdout")) fp = stdout; else if (!strcmp(argv[1], "stderr")) fp = stderr; else if ((fp = fopen(argv[1], "r")) == NULL) { perror("fopen"); exit(1); } else if (getc(fp) == EOF) perror("getc"); 52

buffer.c printf(" 스트림 = %s, ", argv[1]); if (fp->_flags & _IO_UNBUFFERED) printf(" 버퍼미사용 "); else if (fp->_flags & _IO_LINE_BUF) printf(" 줄버퍼사용 "); else printf(" 완전버퍼사용 "); } printf(", 버퍼크기 = %d\n", fp->_io_buf_end - fp->_io_buf_base); exit(0); 53

setbuf()/setvbuf() #include <stdio.h> void setbuf (FILE *fp, char *buf ); int setvbuf (FILE *fp, char *buf, int mode, size_t size ); 버퍼의관리방법을변경한다 호출시기 스트림이오픈된후, 입출력연산수행전에호출되어야함 54

setbuf() void setbuf (FILE *fp, char *buf ); 버퍼사용을 on/off 할수있다. buf 가 NULL 이면버퍼미사용방식 buf 가 BUFSIZ 크기의공간을가리키면완전 / 줄버퍼방식 터미널장치면줄버퍼방식 그렇지않으면완전버퍼방식 55

setvbuf() int setvbuf (FILE *fp, char *buf, int mode, size_t size ); 버퍼사용방법을변경 리턴값 : 성공하면 0, 실패하면 nonzero mode _IOFBF : 완전버퍼방식 _IOLBF : 줄버퍼방식 _IONBF : 버퍼미사용방식 56

setvbuf() mode == _IONBF buf 와 size 는무시됨 mode == _IOLBF or _IOFBF buf 가 NULL 이아니면 buf 에서 size 만큼의공간사용 NULL 이면라이브러리가알아서적당한크기할당사용 stat 구조체의 st_blksize 크기할당 (disk files) st_blksize 값을알수없으면 BUFSIZ 크기할당 (pipes) 57

예제 :setbuf #include <stdio.h> main() { printf(" 안녕하세요, "); sleep(1); printf(" 리눅스입니다!"); sleep(1); printf(" \n"); sleep(1); } setbuf(stdout, NULL); printf(" 여러분, "); sleep(1); printf(" 반갑습니다 "); sleep(1); printf(" ^^"); sleep(1); printf(" \n"); sleep(1); 58

예제 :setvbuf #include <stdio.h> int main( void ) { char buf[1024]; FILE *fp1, *fp2; fp1 = fopen("data1", "a"); fp2 = fopen("data2", "w"); if( setvbuf(fp1, buf, _IOFBF, sizeof( buf ) )!= 0 ) printf(" 첫번째스트림 : 잘못된버퍼 \n" ); else printf(" 첫번째스트림 : 1024 바이트크기버퍼사용 \n" ); } 59 if( setvbuf(fp2, NULL, _IONBF, 0 )!= 0 ) printf(" 두번째스트림 : 잘못된버퍼 \n" ); else printf(" 두번째스트림 : 버퍼미사용 \n" );

fflush() #include <stdio.h> int fflush (FILE *fp); fp 스트림의출력버퍼에남아있는내용을 write() 시스템호출을통하여커널에전달한다 리턴값 : 성공하면 0, 실패하면 EOF (-1) fp 가 NULL 이면, 모든출력스트림의출력버퍼에남아있는내용을커널에전달한다 60

핵심개념 파일은모든데이터를연속된바이트형태로저장한다. 파일을사용하기위해서는반드시파일열기 fopen() 를먼저해야하며파일열기를하면 FILE 구조체에대한포인터가리턴된다. FILE 포인터는열린파일을나타낸다. fgetc() 함수와 fputc() 함수를사용하여파일에문자단위입출력을할수있다. fgets() 함수와 fputs() 함수를이용하여텍스트파일에서한줄씩읽거나쓸수있다. fread() 와 fwrite() 함수는한번에일정한크기의데이터를파일에읽거나쓴다. 열린파일에서다음읽거나쓸파일내위치를현재파일위치라고하며파일위치포인터가그파일의현재파일위치를가리키고있다. fseek() 함수는현재파일위치를지정한위치로이동시킨다. 61