1 / 57

C 언어 및 실습 C Language and Practice

C 언어 및 실습 C Language and Practice. Chap 11. 파일 I/O. 단원의 개요. 단원의 학습목표. 학습 유의점. 1. C 언어의 라이브러리 함수를 이해하기 위해 각 함수들의 구성 요소에 대해 알아본다 . 2. 문자열 상수를 취급하는 함수 , 문자열 길이를 연산하는 함수 , 문자열 임출력 함수 , 문자열 처리 함수에 대해서 알아본다 .

cormac
Télécharger la présentation

C 언어 및 실습 C Language and Practice

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. C언어 및 실습C Language and Practice Chap 11. 파일 I/O

  2. 단원의 개요 단원의 학습목표 학습 유의점 1. C언어의 라이브러리 함수를 이해하기 위해 각 함수들의 구성 요소에 대해 알아본다. 2. 문자열 상수를 취급하는 함수, 문자열 길이를 연산하는 함수, 문자열 임출력 함수, 문자열 처리 함수에 대해서 알아본다. 3. 입출력을 지원하는 파일 접근(access)함수, 레코드 입출력 함수, 기억 장소 할당 함수, 랜덤 접근 함수에 대해서 알아본다. 1. 파일 접근 함수들은 파일 포인터가 동일하게 처리된다는 것을 파악한다. 2. 사용자가 정의한 레코드를 사용하여 입출력할 때에는 사용자가 지정한 기억 장소를 포인터로 선언해야 하는 것을 예제 프로그램을 통해 이해한다. 3. 파일을 랜덤하게 처리하려면 fseek(), ftell() 등을 이용하여 포인터 값을 정확하게 계산해야 함에 주의한다. 4. 시스템 수준에서 파일 입출력을 취급하려면 사용자가 버퍼를 정확하게 지정해야 함에 주의한다. 단원의 학습계획 사용된 함수와 선행처리기 1. 저수준 파일 I/O 파일을 열고 닫는 함수와 파일 입출력 함수들을 실례예를 중심으로 이해한다. 2. 고수준 파일 I/O 파일의 입출력을 레코드 단위로 처리하는 입출력 함수들을 이해한다. 기억장소를 할당하는 함수들을 알아본다. 랜덤하게 파일을 접근하기 위해서 포인터의 위치를 관리하는 함수들에 대해 알아본다. • 함 수 : open(), creat(), close(), read(), write(), lseek(), fopen(), fclose(), getc(), fgetc(), putc(), fputc(), fgets(), fputs(), fscanf(), fprintf(), fread(), fwrite(), fseek(), ftell(), rewind(), feof(), exit() 단일문자 파일 입출력함수(fgetc(), fputc()), (문자열[행] 파일 입출력함수(fgets), fputs()), 서식[양식]파일 입출력함수(fscanf(), fprintf()), 레코드[블럭] 파일 입출력함수(fread(), fwrite()), 직접접근 파일 입출력함수(fseek(),ftell(), rewind())

  3. FILE 구조체형이 정의되어 있음 파일이라는 대상에 대한 접근을 위함 저수준 파일 입출력 파일을 읽기 또는 쓰기를 할 수 있도록 파일을 열어주는 함수를 사용 파일과 관련한 데이터 처리 파일에 대한 접근권한을 반환 파일(=화일)I/O • C 언어는 자체의 파일 입.출력 기능이 없는 대신에 라이브러리 함수를 통하여 수행 • 파일 처리(열기, 읽기, 쓰기, 닫기) 의 수행 단계 헤더파일 <stdio.h>을 포함시킨다 고수준 파일 입출력 파일 포인터를 선언한다 파일을 연다(open) 입출력 처리 파일을 닫는다(close)

  4. FILE 구조체형이 정의되어 있음 고수준 파일 입출력 파일이라는 대상에 대한 접근을 위함 저수준 파일 입출력 파일을 읽기 또는 쓰기를 할 수 있도록 파일을 열어주는 함수를 사용 파일과 관련한 데이터 처리 파일에 대한 접근권한을 반환 파일 I/O • C 언어는 자체의 파일 입출력 기능이 없는 대신에 라이브러리 함수를 통하여 수행 • 파일 처리의 수행 단계 #include <io.h> #include <fcntl.h> #include <stdio.h> #define RECSIZE 21 void main() { intfd; char buf[RECSIZE+1]; fd=open("data1.txt", O_RDONLY); if(fd<0) { printf("(data1.txt) open error !"); exit(1); } while(1) { if(read(fd,buf,RECSIZE)==0){ break; } buf[RECSIZE]='\0'; printf("%s\n",buf); } close(fd); } 헤더파일들을 포함시킨다 파일 포인터(fp) 를 선언한다 파일 기술자 (fd) 를 선언한다 파일 기술자 또는 포인터를 선언한다 FILE *in, *out; /* 파일 pointer 변수 선언 */ : in = fopen("sam.txt","r"); /*사용할 파일의 개방 */ out = fopen("sam.txt1","w"); : * 파일 처리 */ : fclose (in); /* 파일의 패쇄 */ fclose(out); : 파일을 연다(open) 입출력 처리 파일을 닫는다(close)

  5. 파일 핸들(fd) 내 용 표 11-1 파일 핸들 0 1 2 3 4 표준 입력(stdin) 표준 출력(stdout) 표준 출력 오류(stderr) 표준 범용 입출력(stdaux) 표준 프린터 출력(stdprn) 저수준 파일 I/O • 저수준 파일 I/O • 바이트 단위로 입출력을 수행 • 입출력을 위한 버퍼, 카운터 및 포인터인 파일 핸들을 프로그래머가 직접 지정 • 파일 핸들 : int형 파일 기술자( fd: file descriptor)를 사용 • 저수준 파일 입출력함수 • 파일개폐,생성 : open(), close(), creat() • 파일입출력 : read(), write() • 파일접근 : lseek()

  6. 저수준 파일 I/O • open( ) 함수 • 파일을 읽기 또는 쓰기를 할 수 있도록 파일을 열어(개방)주는 함수 • 헤더파일io.h파일을 추가 • 함수 사용시 반환(return)값 • 파일 open 성공( 파일 있음)-> fd= 0 또는 양의 정수 • 파일 open error(파일 없음) -> fd= -1 함수 원형 : int open(const char*, int, [unsigned int]); 함수 사용 : #include <io.h> #include <fcntl.h> /* 파일 열기 모드 종류 정의 */ char *name; /* 화일명 */ intmode; /* 화일 열기 모드(화일 핸들) */ intaccess; /* 접근(access)허가 모드 */ intfd; fd= open(name, mode [, access]);

  7. 모 드 내 용 O_RDONLY O_WRONLY O_RDWR O_CREAT O_TRUNC O_EXCL O_APPEND O_BINARY O_TEXT 읽기 전용으로 파일을 연다. 쓰기 전용으로 파일을 연다. 읽기와 쓰기 전용으로 파일을 연다. 신규 파일을 만들고 파일을 연다. 이미 존재하는 파일을 열고 그 파일의 내용을 없앤다. 이미 파일이 존재하면 신규 파일을 만들지 않는다. 존재하는 파일 내용 끝에 추가하기 위해 파일을 연다. 존재하는 파일을 2진 모드로 연다. 존재하는 파일을 텍스트 모드로 연다. 저수준 파일 I/O • 표 11-2 입출력 모드(mode)의 종류 • 헤더파일 ‘fcntl.h’에 정의 • 보기 11-1 fd= open("infile", O_RDONLY, 0) /* 읽기 전용으로 화일을 연다 */ fd= open(name, mode [, access]); • access는 파일 접근에 대한 허가코드로서 파일을 여는 경우에 그 값은 0으로 설정되고 생략 가능함

  8. 저수준 파일 I/O #include <io.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #define SIZE 15 void main() { intfd; char buf[SIZE+1]; /*한글은 두바이트로 취급함*/ fd=open("c://com/학생1.txt", O_RDONLY); printf(“Open-fd의값은=== %d\n\n", fd); if(fd<0) { printf("(학생.txt) 없음: open error !"); exit(1); } while(1) { if( read( fd, buf, SIZE) == 0) { break; } buf[SIZE]='\0'; printf("%s\n",buf); } close(fd); printf("\nClose-fd의 값 === %d\n\n",fd); } • close( ) 함수 • 파일을 닫아(폐쇄)주는 함수 • 함수 사용시 반환(return)값 • 파일 close 성공 -> 0 또는 양수 • 파일 close 실패 -> -1 함수 원형 : int close(int ); 함수 사용 : intfd; /* fd : 파일 핸들 */ int close(fd);

  9. 접근모드(access) 내 용 S_IWRITE S_IREAD S_IREAD|S_WRITE 쓰기가 가능하도록 한다. 읽기가 가능하도록 한다. 읽고/쓰기가 가능하도록 한다. 저수준 파일 I/O • creat( ) 함수 • 새로운 파일을 생성하여 주는 함수 • 함수 사용시 반환(return)값 • 파일 생성 성공 -> 0 , 실패 -> -1 함수 원형 : intcreat( const char*,int); 함수 사용 : char *filename; /* 파일명 */ int access; /* 접근 허가 모드 */ intcreat(filename, access); 사용 예) : intfd; fd= creat(“file_txt” , S_IREAD); : close(fd);

  10. 저수준 파일 I/O • read( ) 함수 • 지정한 파일의 자료를 지정한 바이트 수(nbyte)만큼 버퍼(buf)로 읽어 들이는 기능을 수행하는 함수 • 함수 사용시 반환(return)값 • 파일 read 성공 -> 실제 read된 자료의 byte 수(파일의 끝에 도달하면 0 반환) • 파일 read 실패 -> -1 함수 원형 : int read(int, const char*,int ); 함수 사용 : intfd; /* 파일 핸들 */ char *buf; /* 저장되는 버퍼 */ intnbyte; /* 한번에 반환되는 바이트 수 */ int read(fd,buf, nbyte); fd= read (name, mode [, access]);

  11. 저수준 파일 I/O • write( ) 함수 • 버퍼(buf)에 저장되어 있는 자료를 지정된 바이트 수(nbytes)만큼 파일 포인터로 지정한 파일 에 쓰는 기능을 수행하는 함수 • 함수 사용시 반환(return)값 • 파일 write 성공 -> 실제 write된 자료의 byte 수 • 파일 write 실패 -> -1 함수 원형 : int write(int, const char*, unsigned int ); 함수 사용 : intfd; /* 화일 핸들 */ char *buf; /* 저장되는 버퍼 */ unsigned intnbyte; /* 1번에 반환되는 바이트 수*/ int write(fd, buf, nbyte); fd= open(name, mode [, access]);

  12. Mode File Location SEEK_SET(0) SEEK_CUR(1) SEEK_END(2) 파일 시작 현재 파일 포인터 위치 파일의 끝 저수준 파일 I/O • lseek( ) 함수 • 지정한 파일을 임으로 읽기 또는 쓰기를 하고자 할 때, 현재 모드에 지정한 위치부터 offset에 해당하는 바이트 수 만큼 파일 포인터를 이동하는 함수 • 함수 사용시 반환(return)값 • 입출력 위치 이동 성공 -> 파일 선두부터 새로운 포인터 위치 offset의 byte 수 • 입출력 위치 이동 실패 -> -1L • 세가지 형태의 이동 시작 위치 모드 함수 원형 : long lseek(int, long, int ); 함수 사용 : int fd; /* 화일 핸들 */ long offset; /* 이동 바이트 수 */ int mode; /* 이동 시작 위치 모드*/ long lseek(fd, offset, mode);

  13. 고수준 파일 I/O • 고수준 파일 I/O • 파일을 블록 단위로 읽어서 일단 버퍼에 저장한 후 버퍼 영역에 있는 데이터들을 하나의 단위로 처리 • 파일 처리 함수들이 고유의 버퍼링을 제공하므로 섹터 크기, 버퍼 길이 등의 운영체제에 종속적인 사항을 고려하지 않아도 됨 • 고순준 파일 입출력함수 • 파일끝과 에러 조사 : feof(),ferror() • 파일 접근: fopen(), freopen(), fclose(), fflush() • 파일 위치 지정: fseek(), rewind(), ftell() • 문자 입.출력 : fgetc(), fputc() • 문자열(행) 입.출력 : fgets(), fputs() • 블록 입.출력: fread(), fwrite() • 양식(서식) 입.출력: fscanf(), fprintf()

  14. 고수준 파일 I/O • 고수준 파일 I/O • 파일 포인터 • C언어에서 파일을 다루기 위해 정의한 구조체 • 파일에 대한 여러가지 정보와 파일에 접근하기 위한 포인터에 대한 정보, 그리고 파일을 읽고 쓰기 위한 내부 버퍼에 대한 정보를 가짐 • 헤더파일 ‘stdio.h’에 정의되어 있음 • 보기 11-2 파일 포인터의 선언의 예 #include <stdio.h> // fopen() fclose() void main() { FILE *fp; // 화일 포인터 선언 char ch; fp= fopen("c://com/ 알파베트1.txt", "r" ); if( fp == NULL ) { puts( "파일을생성할수없음." ); } else { ch = fgetc( fp ); //한 문자 읽어 저장 printf( "읽은문자: %c \n\n", ch); fclose( fp ); } } #include <stdio.h> ... FILE *fp; /* 화일 포인터의 선언 */

  15. 모 드 기 능 “r” “w” “a” 파일에서 읽기 전용 모드 파일에서 쓰기 전용 모드 파일 끝에 내용 추가 모드 “r+” “w+” “a+” 파일을 갱신(읽기/쓰기)하는 모드 “r+”와 같은 기능이지만 기존 파일을 삭제하는 모드 파일의 끝에 추가하고 갱신하는 모드 고수준 파일 I/O ( fopen(), fclose() ) • fopen( )함수 • 사용하고자 하는 파일을 먼저 개방(open)해주는 기능을 수행하는 함수 • 함수 사용시 반환(return)값 • 파일 open 성공 -> 개방할 파일에 대한 포인터를 반환하며 그것을 파일 포인터 변수에 할당한다. • 파일 open 실패 -> NULL값을 반환한다. 함수 원형 : FILE fopen(const char*, const char); 함수 사용 : FILE *fp; /* 파일 포인터 선언 */ fp= fopen(“file-name”, mode); /* fp는 파일포인터의 선언명과 일치*/ 표 11-3 파일 모드(mode)

  16. 고수준 파일 I/O • fclose( )함수 • fopen() 함수에 의해 개방되어 있는 파일을 닫고 파일 포인터의 설정을 해제 • 함수 사용시 반환(return)값 • 파일 close 성공 -> 0 • 파일 close 실패 -> -1 • fopen( ) / fclose( ) 함수의 예 #include <stdio.h> // fopen(), fclose(), fgetc() void main() { FILE *in, *out; // 파일포인터 char ech, kch; in = fopen(" c://com/ 영문1.txt", "r" ); out= fopen(" c://com/ 숫자1.txt", "r" ); if( (in == NULL) && (out = NULL)) { puts( "파일을 생성할 수 없음." ); } else { ech = fgetc( in ); kch = fgetc( out ); printf("영문-읽은 첫문자: %c \n\n", ech ); printf(“숫자-읽은 첫 문자: %c \n\n", kch ); } fclose( in ); fclose( out ); } 함수 원형 : intfclose(FILE*); 함수 사용 : FILE *fp; intfclose(fp); /* fp는 파일포인터의 선언명과 일치*/ : FILE *in, *out; /* 파일 pointer 변수 선언 */ in = fopen(“영문.txt","r"); /* 사용할 파일의 개방 */ out = fopen(“숫자.txt1",“r"); : fclose(in); /* 파일의 패쇄 */ fclose(out); :

  17. 고수준 파일 I/O -단일문자 파일 입출력 함수(fgetc(), fputc()) • 단일문자 파일 입출력 함수 • getc( ) 함수 • 파일에서 한 문자를 변수로 읽어 들이는 매크로 함수 • 파일포인터의 위치에서 한 문자를 읽어 들이고 파일포인터를 1증가 • 함수 사용시 반환(return)값 • 성공 -> 읽은 문자(파일 포인터가 가리키는 파일내위치값) • 실패 또는 파일의 끝 -> EOF(-1) • 개방된 파일이 2진 파일인 경우 파일의 끝을 결정하는 함수 feof()가 요구 함수 원형 : intgetc(FILE*); 함수 사용 : FILE *fp; /* 파일 포인터의 선언 */ int c; /* 저장 변수 */ c= getc(fp);

  18. 고수준 파일 I/O -단일문자 파일 입출력 함수 (fgetc(), fputc()) • fgetc( ) 함수 • 파일(파일포인터)에서 한 문자를 변수로 읽어 들이는 함수 • 함수 사용시 반환(return)값 • 성공 -> 읽은 문자(파일 포인터가 가리키는 파일내위치값) • 실패 또는 파일의 끝 -> EOF(-1) /* 매크로 함수*/ #include <stdio.h> #define square(x) x*x int main() { printf("square(3) : %d \n", square(3) ); } -------------------- /* 함수 */ #include <stdio.h> intsquare(int x) {   return x*x; } int main( ) { printf("%d", square(3) );  } /* 매크로 함수*/ #include <stdio.h> #define square(x) x*x int main() { printf("square(3) : %d \n", square(3) ); } 함수 원형 : intfgetc(FILE*); 함수 사용 : FILE *fp; /* 파일 포인터의 선언 */ int c; /* 저장 변수 */ c= fgetc(fp);

  19. 고수준 파일 I/O -단일문자 파일 입출력 함수 (fgetc(), fputc()) • putc( ) 함수 • 변수를 파일(파일포인터)에 쓰는 매크로함수 • fputc( ) 함수 • 변수를 파일(파일포인터)에 쓰는 함수 • 함수 사용시 반환(return)값 • 성공 -> 읽은 문자(파일 포인터가 가리키는 파일내위치값) • 실패 또는 파일의 끝 -> EOF(-1) 함수 원형 : intputc(int, FILE*); 함수 사용 : FILE *fp; /* 파일 포인터의 선언 */ intc; /* 저장 변수 */ putc(c, fp); 함수 원형 : intfputc(int, FILE*); 함수 사용 : FILE *fp; /* 파일 포인터의 선언 */ intc; /* 저장 변수 */ fputc(c, fp);

  20. 고수준 파일 I/O -단일문자 파일 입출력 함수 (fgetc(), fputc()) #include <stdio.h> // fgetc(), fputc() : 함수로 사용 void main() { FILE *file1; // fgetc() FILE *file2; // fputc() char ch; file1 = fopen("c://com/영문1.txt", "r" ); ch = fgetc(file1); printf("영문1.txt에서 읽은 첫 문자 : %c \n\n", ch); fclose( file1); file2 = fopen(" c://com/ 영문2.txt", "w+" ); if( file2 == NULL ) { puts( "파일을생성할수없습니다." ); } else { fputc('Z', file2); fputc('O', file2); fputc('O', file2); puts( "영문2.txt 파일이 해당 디렉트리밑에새로생성 확인해보세요.\n" ); fclose( file2 ); } } #include <stdio.h> // getc(), putc() : 매크로함수 void main() { FILE *file1; // getc() FILE *file2; // putc() char ch; file1 = fopen("c://com/영문1.txt", "r" ); ch = getc(file1); printf("영문1.txt에서 읽은 첫 문자: %c \n\n", ch); fclose( file1); file2 = fopen(" c://com/ 영문2.txt", "w+" ); if( file2 == NULL ) { puts( "파일을생성할수없습니다." ); } else { putc('Z', file2); putc('O', file2); putc('O', file2); puts( "영문2.txt 파일이 해당 디렉트리밑에새로생성 확인해보세요.\n" ); fclose( file2 ); } } • putc( ) 함수 • 변수를 파일(파일포인터)에 쓰는 매크로함수 • fputc( ) 함수 • 변수를 파일(파일포인터)에 쓰는 함수 • 함수 사용시 반환(return)값 • 성공 -> 읽은 문자(파일 포인터가 가리키는 파일내위치값) • 실패 또는 파일의 끝 -> EOF(-1) 함수 원형 : intputc(int, FILE*); 함수 사용 : FILE *fp; /* 파일 포인터의 선언 */ intc; /* 저장 변수 */ putc(c, fp); 함수 원형 : intfputc(int, FILE*); 함수 사용 : FILE *fp; /* 파일 포인터의 선언 */ intc; /* 저장 변수 */ fputc(c, fp);

  21. 고수준 파일 I/O - 문자열의 파일 입출력 함수(fgets(), fputs()) • 문자열의 파일 입출력 함수 • fgets( ) 함수 • 파일로부터 n-1개의 문자들을 읽어들여 버퍼에 저장 • 개행문자(\n)를 읽으면 중단하고, 문자열 끝에 ‘\n’, ‘\0’을 추가 • 함수 사용시 반환(return)값 • 성공 -> 입력받은 문자열을 버퍼에 저장 • 실패 -> NULL문자 반환 함수 원형 : int fgetc(char*, int, FILE*); 함수 사용 : FILE *fp; /* 파일 포인터의 선언 */ char *s; /* 문자열 저장 버퍼 */ int n; /* 최대 입력 문자수 */ fgets(s, n, fp);

  22. 고수준 파일 I/O - 문자열의 파일 입출력 함수 (fgets(), fputs()) • fputs( ) 함수 • 인수로 주어진 문자열을 NULL 문자를 제외하고 모두 지정된 파일에 출력 • 개행문자(\n)를 추가로 출력하지 않음 • 함수 사용시 반환(return)값 • 성공 -> 출력한 문자열 • 실패 -> EOF(-1) #include <stdio.h> // fgets(), fputs(), void main() { FILE *fp; char buffer[27]; fp = fopen( "c://com/ 영문26.txt", "r" ); if( fp == NULL ) { puts( "파일을 생성할 수 없습니다." ); } else { fgets(buffer,26, fp ); // fp포인터점에서25문자를 읽음 printf("fgets실행후buffer의 내용: %s\n\n", buffer); fclose(fp); fp = fopen( “c://com/영문2.txt", "w+" ); fputs("These are American Alpabetics \n", fp ); printf("영문2.txt에 저장된 내용확인바랍니다\n\n"); fclose( fp ); } } 함수 원형 : intfputs(char*, FILE*); 함수 사용 : FILE *fp; /* 파일 포인터의 선언 */ char *c; /* 출력할 문자열 */ fputs(c, fp);

  23. 제어문자의 종류(교재 232pp 참조) d -> 10진수 형태의 정수 i -> 8진수, 10진수, 또는 16진수 형태의 정수(0, 0x, 0X 로 시작) o -> 8진수 형태의 정수(0으로 시작하지 않아도 됨) u -> 부호가 없는 10진수 형태의 정수 x -> 16진수 형태의 정수(0x, 0X로 시작하지 않아도 됨) c -> 문자 s -> 문자열 e,f,g -> 실수 % -> 문자 %. 단지 문자 %를 건너뛰기 위해 사용 고수준 파일 I/O - 서식화된 파일 입출력 함수(fscanf(),fprintf()) • 서식화된 파일 입출력 함수 • fscanf( ) 함수 • 파일로부터 지정된 형태로 읽어들여 뒤에 오는 인수에 대입하는 함수 • 파일포인터를 제외하고는scanf()함수와 동일 • 파일포인터 위치에 stdin을 사용하면 scanf() 처럼 키보드에서 입력가능 • 함수 사용시 반환(return)값 • 성공 -> 입력된 항목의 수 • 파일의 끝이거나 실패 -> EOF(-1) • 저장하지 못한 경우 -> 0 • 제어문자는 scanf() 함수와 동일 함수 원형 : intfscanf(FILE*, char* [, ...]); 함수 사용 : FILE *fp; /* 파일 포인터의 선언 */ fscanf(fp, “제어문자”, &arg1, &arg2, ... , &argN);

  24. 출력양식의 종류(교재 232pp 참조) d, i -> 부호를 갖는 10진수 형태의 정수 u -> 부호를 갖지 않는 10진수 형태의 정수 o -> 부호를 갖지 않는 8진수 형태의 정수 x, X-> 부호를 갖지 않는 16진수 형태의 정수 c -> unsigned char형으로 변환된 단일 문자 f -> 000,00 형태의 실수 e, E-> 000.00e±00 또는 000.00E±00 형태의 실 % -> 문자 %. 단지 문자 %를 출력하기 위해 사용 고수준 파일 I/O - 서식화된 파일 입출력 함수(fscanf(),fprintf()) • fprintf( ) 함수 • 지정된 출력 형식을 파일에 출력하는 함수 • 파일포인터를 제외하고는printf()함수와 동일 • 파일포인터 위치에 stdout을 사용하면 printf() 함수처럼 화면에 출력가능 • 파일포인터 위치에 stdprn을 사용하면 printf() 함수처럼 프린터에 출력가능 • 함수 사용시 반환(return)값 • 성공 -> 파일에 쓰여진 문자의 수 • 실패 -> -1 • 제어문자는 printf() 함수와 동일 함수 원형 : int printf(FILE*, char* [, ...]); 함수 사용 : FILE *fp; /* 파일 포인터의 선언 */ fprintf(fp, “출력양식”, &arg1, &arg2, ... , &argN);

  25. #include <stdio.h> // fscanf(), fprintf() #include <io.h> #include <stdlib.h> int main(void) { FILE *fp; FILE *sfp; char D_name[30]; int score; if((fp=fopen("c://com/test,txt","w")) == NULL) { /* test화일 생성*/ printf("Can not open test file. \n"); exit(1); } printf("1-Enter D-name and score : "); fscanf( stdin, "%s %d", D_name, &score); /* 키보드로부터직접입력scanf()와 같음*/ fprintf( stdout, "fprintf = %s %d \n", D_name, score); /* 아래printf()와 같음*/ printf("printf = %s %d \n", D_name, score); fprintf(fp, "%s %d", D_name, score); /* test화일에 키보드로 입력한내용이 저장됨*/ fclose(fp); // test화일 만들어 있는지 fscanf()로 읽어 확인 한다. if((sfp=fopen("c://com/test.txt","r")) == NULL) { /* fprintf()에 의해 생성된 test 파일을 읽음 */ printf("Can not open test file. \n"); exit(1); } printf("\ntext파일에 저장된 내용이 "); fscanf(sfp, "%s %d", D_name, &score); /* text 화일로부터읽음*/ fprintf(stdout, "%s %d 임을 확인하세요\n\n", D_name, score); /* 화면출력 printf()와 같음*/ fclose(sfp); } } 고수준 파일 I/O - 서식화된 파일 입출력 함수(fscanf(),fprintf()) • 서식화된 파일 입출력 함수 • fscanf( )함수의 제어문자 • fprintf( ) 함수의 출력양식

  26. 고수준 파일 I/O- 레코드(블록) 단위의 파일 입출력 함수(fread(),fwrite()) • 레코드(블록) 단위의 파일 입출력 함수 • fread( ) 함수 • 지정한 파일로부터일정크기의 레코드n개를 읽어 버퍼에 저장하는 함수 • 함수 사용시 반환(return)값 • 성공 -> 읽혀진 레코드 수 • 파일의 끝이거나 실패 -> 0 함수 원형 : void fread(char*, int, int, FILE*); 함수 사용 : FILE *fp; /* 파일 포인터의 선언 */ char *s; /* 읽을 자료 저장 공간 */ intsize, n; /* 1레코드의 크기, 레코드의 개수 */ fread(s, size, n, fp); FILE *infile, *outfuile; Char string[30]; : infile=fopen("testin", "r"); outfile=fopen("testout", "w"); : fread(string, sizeof(char), length, infile); fwrite(string, sizeof(char), length, outfile);

  27. 고수준 파일 I/O - 레코드(블록) 단위의 파일 입출력 함수(fread(),fwrite()) • fwrite( ) 함수 • 버퍼로부터 일정크기의 레코드n개를 읽어 지정한 파일에 저장하는 함수 • 함수 사용시 반환(return)값 • 성공 -> 쓰여진 레코드 수 • 실패 -> 0 함수 원형 : intfwrite(const void*, int, int, FILE*); 함수 사용 : FILE *fp; /* 파일 포인터의 선언 */ char *s; /* 쓸 자료 저장 공간 */ intsize, n; /* 1레코드의 크기, 레코드의 개수 */ fwrite(s, size, n, fp); FILE *infile, *outfuile; char string[30]; : infile=fopen("testin", "r"); outfile=fopen("testout", "w"); : fread(string, sizeof(char), length, infile); fwrite(string, sizeof(char), length, outfile);

  28. 고수준 파일 I/O - 직접 접근(random) 파일(위치지정) 입출력 함수fseek(), rewind(), ftell(), feof() • 직접 접근(random) 파일 입출력 함수 • fseek( ) 함수 • 파일포인터로 지정한 파일 상에서 정해진 포인터 기점(ptrmode)으로부터 offset 바이트 수 만큼이동시키는 함수 • 함수 사용시 반환(return)값 • 지정한 위치로 이동시 -> 0 • 그 외의 경우 -> 0 이외의 값 함수 원형 : int fseek(FILE*, long, int); 함수 사용 : FILE *fp; /* 파일 포인터의 선언 */ long offset; /* 이동 바이트 수 */ int ptrmode; /* 이동 위치 모드 */ fseek(fp, offset, ptrmode); 0(SEEK_SET)인 경우 : 파일의 첫위치 1(SEEK_CUR)인 경우 : 파일내 포인터의 현재 위치 2(SEEK_END)인 경우 : 파일의 끝위치

  29. 고수준 파일 I/O • fseek( ) 함수 • 이동 위치 모드 ( FP - 현재 파일 포인터의 위치 ) fseek(stream, 0L, SEEK_SET) fseek(stream, 1L, SEEK_SET) fseek(stream, -1L, SEEK_CUR) fseek(stream, 0L, SEEK_CUR) fseek(stream, 1L, SEEK_CUR) FP fseek(stream, -1L, SEEK_END) fseek(stream, 0L, SEEK_END)

  30. SEEK_SET SEEK_CUR SEEK_END FP 고수준 파일 I/O - 직접 접근(random) 파일(위치지정) 입출력 함수fseek(), rewind(), ftell(), feof() • fseek( ) 함수 • 이동 위치 모드 ( FP - 현재 파일 포인터의 위치 ) fseek( stream, L, ) 0 1 2 3 6 SEEK_SET

  31. SEEK_SET SEEK_CUR SEEK_END FP 고수준 파일 I/O - 직접 접근(random) 파일(위치지정) 입출력 함수fseek(), rewind(), ftell(), feof() • fseek( ) 함수 • 이동 위치 모드 ( FP - 현재 파일 포인터의 위치 ) fseek( stream, L, ) SEEK_CUR -2 -5 0 1 3

  32. SEEK_SET SEEK_CUR SEEK_END FP 고수준 파일 I/O - 직접 접근(random) 파일(위치지정) 입출력 함수fseek(), rewind(), ftell(), feof() • fseek( ) 함수 • 이동 위치 모드 ( FP - 현재 파일 포인터의 위치 ) fseek( stream, L, ) 0 SEEK_END -1 -2 -3 -6

  33. 고수준 파일 I/O - 직접 접근(random) 파일(위치지정) 입출력 함수fseek(), rewind(), ftell(), feof() • ftell( ) 함수 • 파일의 현재 위치를 알리는 함수 • 함수 사용시 반환(return)값 • 성공 -> 파일의 현재위치(파일 앞에서부터 바이트 길이) • 실패 -> EOF(-1) 함수 원형 : long ftell(FILE*); 함수 사용 : FILE *fp; /* 파일 포인터의 선언 */ long fp_location; fp_location = ftell(fp);

  34. fseek(fp, 0L, 0); 과 같은 의미 고수준 파일 I/O - 직접 접근(random) 파일(위치지정) 입출력 함수fseek(), rewind(), ftell(), feof() • rewind( ) 함수 • 파일의 위치를 선두로 재설정하는 함수 • 함수 사용시 반환(return)값은 없음 • feof( ) 함수 • 파일의 끝인지를 확인하는 함수 • 함수 사용시 반환(return)값 • 파일의 끝이면 1을 아닌 경우 0을 반환 함수 원형 : void rewind(FILE*); 함수 사용 : FILE *fp; /* 파일 포인터의 선언 */ rewind(fp); 함수 원형 : int feof(FILE*); 함수 사용 : FILE *fp; /* 파일 포인터의 선언 */ feof(fp);

  35. #include <stdio.h> //fread(), fwite(), fseek(), ftell(), rewind(), feof() void main() { FILE *infile, *outfile, *fseekfile; char string[500]; long length; long f_location; infile=fopen("c://com/testin.txt", "r"); outfile=fopen("c://com/testout.txt", "w"); fseekfile=fopen("c://com/testfseek.txt","w"); printf("testin화일로부터20문자만fread()하여 fwrite() 수행후\n"); printf("새로 생성된 testout화일을 확인하시오? \n\n"); length = 20; fread(string, sizeof(char), length, infile); fwrite(string, sizeof(char), length, outfile); printf("testin화일의맨앞13번째위치로부터20문자만 fread()하여 fwrite() 수행후\n"); printf("새로생성된testfseek파일을 확인하시오? \n\n"); fseek(infile, 13L, SEEK_SET); fread(string, sizeof(char), length, infile); fwrite(string, sizeof(char), length, fseekfile); f_location= ftell(infile); // testin내 현재 커서위치를 알림 printf("infile의 현재 커서(화일포인터위치)는 %d번째 위치이다\nwn", f_location); if (feof(infile) == 1) { /* 화일포인터위치가 파일의 끝인가? */ printf("End of testin file \n");} else { rewind(infile); /* fseek(infile, 0L, SEEK_SET);와같음, 화일포인터위치를 파일의 첫 위치로 옮김*/ f_location= ftell(infile); printf("rewind()이후 infile화일의 커서(화일포인터위치)는 %d번째위치이다\n\n", f_location); } fclose(infile); fclose(outfile); fclose(fseekfile); } 13번째문자 33번째문자 0번째문자

  36. 고수준 파일 I/O • exit( ) 함수 • 프로그램을 종료시키는데 사용하는 함수 • fopen( )에 의해 열린 파일들을 폐쇄시킴 • 헤더파일stdlib.h파일을 첨가 • 함수 사용시 반환(return)값 • 정상적으로 종료시-> 0 • 오류시-> 오류코드값(error code number) : #include <stdlib.h> : void main() { intfd; fd=open("학생.txt", O_RDONLY); if(fd<0) { printf("(학생.txt) 없음: open error !"); exit(1); // 수행종료 : fclose(fd)와 같음 } else { : // 학생.txt화일 있음: 정상 수행함 : fclose(fd); } 함수 원형 : void exit(int); 함수 사용 : int status; exit(status); 또는 exit(1); , exit(0);

  37. 실 습

  38. 단원의 개요 단원의 학습목표 학습 유의점 1. C언어의 라이브러리 함수를 이해하기 위해 각 함수들의 구성 요소에 대해 알아본다. 2. 문자열 상수를 취급하는 함수, 문자열 길이를 연산하는 함수, 문자열 임출력 함수, 문자열 처리 함수에 대해서 알아본다. 3. 입출력을 지원하는 파일 접근(access)함수, 레코드 입출력 함수, 기억 장소 할당 함수, 랜덤 접근 함수에 대해서 알아본다. 1. 파일 접근 함수들은 파일 포인터가 동일하게 처리된다는 것을 파악한다. 2. 사용자가 정의한 레코드를 사용하여 입출력할 때에는 사용자가 지정한 기억 장소를 포인터로 선언해야 하는 것을 예제 프로그램을 통해 이해한다. 3. 파일을 랜덤하게 처리하려면 fseek(), ftell() 등을 이용하여 포인터 값을 정확하게 계산해야 함에 주의한다. 4. 시스템 수준에서 파일 입출력을 취급하려면 사용자가 버퍼를 정확하게 지정해야 함에 주의한다. 단원의 학습계획 사용된 함수와 선행처리기 1. 저수준 파일 I/O 파일을 열고 eke는 함수와 파일 입출력 함수들을 실예를 중심으로 이해한다. 2. 고수준 파일 I/O 파일의 입출력을 레코드 단위로 처리하는 입출력 함수들을 이해한다. 기억장소를 할당하는 함수들을 알아본다. 랜덤하게 파일을 접근하기 위해서 포인터의 위치를 관리하는 함수들에 대해 알아본다. • 함 수 : open(), creat(), close(), read(), write(), lseek(), fopen(), fclose(), getc(), fgetc(), putc(), fputc(), fgets(), fputs(), fscanf(), fprintf(), fread(), fwrite(), fseek(), ftell(), rewind(), feof(), exit()

  39. 저수준 파일 I/O : 5pp~ 참조 • 저수준 파일 I/O • 예제 1 : data1.txt 파일 내용을 읽어서 화면에 변경시켜서 표시하는 프로그램 #include <io.h> #include <fcntl.h> #include <stdio.h> #define RECSIZE 21 void main() { intfd; char buf[RECSIZE+1]; fd=open("data1.txt", O_RDONLY); if(fd<0) { printf("(data1.txt) open error !"); exit(1); } while(1) { if(read(fd, buf, RECSIZE) == 0) { break; } buf[RECSIZE]='\0'; printf("%s\n",buf); } close(fd); }

  40. 저수준 파일 I/O : 5pp ~ 참조 • 저수준 파일 I/O • 예제 1-1 : data2.txt 파일 내용을 읽어서 화면에 변경시켜서 표시하는 프로그램

  41. 고수준 파일 I/O : 15pp 참조 • fopen( ), fclose( )함수 • 실습 1 : C 드라이브의 루트(root)폴더에 “data1.txt”라는 파일을 생성하는 프로그램을 작성하시오 #include <stdio.h> void main() { FILE *file; file = fopen( "c:\\data1.txt", "w+" ); if( file == NULL ) { puts( "파일을 생성할 수 없습니다." ); } else { puts( "파일이 정상적으로 생성되었습니다." ); fclose( file ); } } ?

  42. 고수준 파일 I/O : 15pp 참조 • 고수준 파일 I/O • 예제 2 : 텍스트 파일을 읽어들여 각 행의 첫머리에 행번호를 덧붙여서 화면으로 출력해주는 프로그램 #include <stdio.h> void main(intargc, char *argv[]) { char buffer[74+1]; int line=1; FILE *stream; if(argc <= 1) puts("Usage: list filename"), exit(1); stream=fopen(argv[1], "r+"); if(stream == NULL) puts("File not found !"), exit(1); while(!feof(stream)){ if(fgets(buffer, 74+1, stream) == NULL) break; printf("%3d: %s", line++, buffer); } }

  43. 고수준 파일 I/O : 18pp 참조 • fputc( )함수 • 실습 2 : ‘c:\data.txt’파일을 생성하고, 문자 ‘A’를 저장하는 프로그램을 작성하시오. #include <stdio.h> void main() { FILE *fp; fp = fopen( "c:\\data.txt", "w+" ); if( fp == NULL ) { puts( "파일을 생성할 수 없습니다." ); } else { fputc( 'A', fp ); puts( "문자 'A'를 파일에 저장하였습니다." ); fclose( fp ); } } ?

  44. 고수준 파일 I/O : 18pp 참조 • fgetc( )함수 • 실습 3 : 실습 3에서 ‘c:\data.txt’파일에 저장한 문자를 읽어서 화면에 출력하는 프로그램을 작성하시오. #include <stdio.h> void main() { FILE *fp; intch; fp = fopen( "c:\\data.txt", "r" ); if( fp == NULL ) { puts( "파일을 생성할 수 없습니다." ); } else { ch = fgetc( fp ); printf( "읽은 문자 : %c \n", ch ); fclose( fp ); } } ?

  45. 고수준 파일 I/O : 18pp 참조 • 고수준 파일 I/O • 예제 3 : 파일 ex.txt의 처음 세문자를 읽어내어 표시하는 프로그램 #include <stdio.h> FILE *fi; void main() { char a; int i; fi = fopen( "ex.txt","r" ); for(i=0; i<3; i++) { a=fgetc(fi); putchar(a); } fclose(fi); } 하나의 변수를 화면에 출력하는 기능을 함 함수 원형 : int putchar(int); 사 용 예 : #include <stdio.h> : char a; putchar(a);

  46. 고수준 파일 I/O : 22pp 참조 • fputs( )함수 • 실습 4 : “대한민국”을 파일에 저장하는 프로그램을 작성하시오. #include <stdio.h> void main() { FILE *fp; fp = fopen( "c:\\data.txt", "w+" ); if( fp == NULL ) { puts( "파일을 생성할 수 없습니다." ); } else { fputs( "대한민국 \n", fp ); fclose( fp ); } } ?

  47. 고수준 파일 I/O : 21pp 참조 • fgets( )함수 • 실습 5 : 실습 4에서 저장한 “대한민국”을 읽는 프로그램을 작성하시오 #include <stdio.h> void main() { FILE *fp; char buffer[100]; fp = fopen( "c:\\data.txt", "r" ); if( fp == NULL ) { puts( "파일을 생성할 수 없습니다." ); } else { fgets( buffer, 100, fp ); puts( buffer ); fclose( fp ); } } ?

  48. 고수준 파일 I/O : 23pp~ 참조 • 고수준 파일 I/O • 예제 4 : 다음의 프로그램은 먼저 읽기 파일 “data2.in”과 쓰기 파일 “data2.out”을 연 다음, 읽기 파일의 내용을 fgets와 fscanf를 이용하여 읽고, 읽은 내용을 fputs와 fprintf를 이용하여 쓰기 파일에 쓰는 프로그램 #include <stdio.h> void main() { FILE *infile, *outfile; intscore1, score2, score3; float mean; char string[500]; infile=fopen( "data2.in","r" ); outfile=fopen( "data2.out","w" ); fgets(string,100,infile); fputs(string,outfile); fscanf(infile,"%d %d %d", &score1, &score2, &score3); mean=(score1+score2+score3)/3; fprintf(outfile," %d %d %d %6.2f", score1, score2, score3, mean); fclose(infile); fclose(outfile); }

  49. 고수준 파일 I/O : 23pp 참조 • fprintf( )함수 • 실습 6 : 정수의 값을 ‘data.txt’파일에 저장하는 프로그램을 작성하시오 #include <stdio.h> void main() { FILE *fp; inti = 12345; fp = fopen( "c:\\data.txt", "w+" ); if( fp == NULL ) { puts( "파일을 생성할 수 없습니다." ); } else { fprintf( fp, "%d", i ); fclose( fp ); } } ?

  50. 고수준 파일 I/O : 23pp 참조 • fscanf( )함수 • 실습 7 : 실습 6에서 저장한 정수의 값을 읽는 프로그램을 작성하시오 #include <stdio.h> void main() { FILE *fp; int i; fp = fopen( "c:\\data.txt", "r" ); if( fp == NULL ) { puts( "파일을 생성할 수 없습니다." ); } else { fscanf( fp, "%d", &i ); printf( "i = %d \n", i ); fclose( fp ); } } ?

More Related