File Structure Chapter 2. Fundamental File Processing Operations IT정보공학부 장 재 우 교수 Unix – Linux 조상 AT&T Bell 연구소- MULTICS OS Ken Thompson : PDP-7 C 언어(1971) Dennis Ritchie High-level I/O (C 스트림) Low-level I/O(C 기반 화일 처리) UNIX OS File Structures - Chapter 2 - -2- E-mail : jwchang@jbnu.ac.kr 1. 파일 입출력 저수준 파일 입출력(Low-level I/O) 파일 지시자: int fd 특징: 빠르다, 바이트 단위 입출력 주요함수: open, close, read, write, lseek 고수준 파일 입출력(High-level I/O) 파일 지시자: FILE *fp 특징: 사용하기 쉽다, 버퍼 단위 입출력 주요함수: fopen, fclose, fread, fwrite, fseek File Structures - Chapter 2 - -3- E-mail : jwchang@jbnu.ac.kr 2. Opening Files(Low-level I/O) 이미 존재하는 화일 열기(open) 화일을 프로그램에 의해 사용될 수 있도록 준비 시작위치는 화일의 처음으로 지정, 판독(read), 기록(write)준비 새로운 화일 생성(creat) 생성 후에 화일이 사용될 준비가 된다는 점이 화일 열기와 동일 생성된 화일은 처음에는 내용이 없기에, 기록 연산만이 의미가 있음 File Structures - Chapter 2 - -4- E-mail : jwchang@jbnu.ac.kr 2. Opening Files(Low-level I/O) fd = open(filename, flags[, pmode]) 인수 // fcntl.h 인수 인수 fd int • 화일 기술자(file descriptor) • 프로그램 내에서 화일을 가리키는 논리적 화일 식별자이고 정수형 • 실패하면 음수를 리턴 filename char * • 물리적 화일의 이름을 갖는 문자열 flags int • open() 함수의 연산을 제어 • 비트간 OR 연산을 취함 O_APPEND, O_CREATE, O_EXCL, O_RDONLY, O_RDWR, O_TRUNC, O_WRONLY pmode int • 화일에 대한 보호 모드를 지정 File Structures - Chapter 2 - -5- E-mail : jwchang@jbnu.ac.kr 3. Closing Files(Low-level I/O) 화일 닫기(close) 화일을 닫으면, 그 논리적 화일 이름은 다른 화일을 위해 사용 가능 close(fd) (file open) write write write [buffer] File Structures - Chapter 2 - (file close) [저장장치] -6- E-mail : jwchang@jbnu.ac.kr 4. Reading and Writing(Low-level I/O) 판독, 기록 함수 Read(Source_file, Destination_addr, Size) Source_file 읽어야 할 정보가 있는 곳 Destination_addr 입력화일에서 읽은 정보를 저장할 곳 화일에 가져올 정보의 크기 Size char buf[100], int r_size =100, int w_size =100 read(int fd, buf, r_size) Write(Destination_file, Source_addr, Size) Destination_file Source_addr Size 데이터를 보내기 위해 사용되는 논리적 화일 이름 보내야 할 정보가 저장되어 있는 곳 기록될 바이트의 갯수 write(int fd, buf, w_size) File Structures - Chapter 2 - -7- E-mail : jwchang@jbnu.ac.kr 5. Opening & Closing Files(High-level I/O) C 스트림 (stdio.h) file = fopen(filename, type) File fp = fopen(“a.txt”, “w”) 인수 타입 설명 file FILE * • 화일 기술자(file descriptor)에 대한 포인터 • 타입 FILE 은 struct_iobuf를 위한 또 다른 이름 filename char * • 화일 이름 type char * • 열기 함수의 연산을 제어 “r”, “w”, “a”, “r+”, “w+”, “a+” fclose(fp) File Structures - Chapter 2 - -8- E-mail : jwchang@jbnu.ac.kr 6. Reading and Writing(High-level I/O) 1) 문자 기반 입출력 fgetc(fp), fputc(int c, fp) 2) 문자열 기반 입출력 fgets(char *buf, int n, fp), fputs(char *buf, fp) 3) 버퍼 기반 입출력 fread(r_buffer, length, # of component, fp) char buf[100], int r_size =100, int w_size =100 Ex) fread(buf, r_size, 1, fp) fwrite(w_buffer, length, # of component, fp) Ex) fwrite(buf, w_size, 1, fp) 4) 형식 기반 입출력 fscanf(fp, “%d”, &a) /* int a; fprintf (fp, “%d”, a) File Structures - Chapter 2 - -9- E-mail : jwchang@jbnu.ac.kr 7. Reading and Writing(C++ 스트림 ) C++ 스트림 (fstream.h) C++에서 오버로딩 (>> (입력), << (출력)) ostream& operator << (char c); C++ 스트림 (fstream.h) 예제 #include <fstream.h> // 스트림을 개방되지 않은 상태로 남겨둠 fstream afile; afile.open(file_name, mode) afile << “201045674” << “Kil-dong” << “Hong” ; afile >> ch ; afile.get(ch), afile.read(buffer, size), afile.write(buffer, size), afile.close() File Structures - Chapter 2 - - 10 - E-mail : jwchang@jbnu.ac.kr 8. Examples of Reading and Writing 소스 예 (C 언어) #include <stdio.h> main() { char ch; FILE *file; char filename[20]; printf(“Enter the name of the file: “); gets(filename); // file = fopen(filename, “r”); // while(fread(&ch, 1, 1, file) !=0 ) fwrite(&ch, 1, 1, stdout); fclose(file); // // // .a // .b } <그림 2.2> listc.cpp File Structures - Chapter 2 - - 11 - E-mail : jwchang@jbnu.ac.kr 8. Examples of Reading and Writing 화일 끝 (end_of_file)의 탐지 화일 끝을 알리는 조건 fread 호출은 값으로 읽은 원소들의 수를 리턴 fread가 0값을 되돌려 준다면, 화일의 끝에 도달 File Structures - Chapter 2 - - 12 - E-mail : jwchang@jbnu.ac.kr 8. Examples of Reading and Writing 소스 예(C++ 언어) <그림 2.3> listcpp.cpp #include <fstream.h> main() { char ch; fstream file; char filename[20]; cout << “Enter the name of the file : “ << flush; // cin >> filename; // file.open(filename, ios::in); // file.unsetf(ios::skipws); // 판독시 공백포함 while(1) { file >> ch; // .a if(file.fail()) break; // .b cout << ch; } file.close(); // } File Structures - Chapter 2 - - 13 - E-mail : jwchang@jbnu.ac.kr 8. Examples of Reading and Writing 화일 끝 (end_of_file)의 탐지 화일 끝을 알리는 조건 file.fail() 은 화일의 끝에 도달했으면, 1 (참)을 리턴 File Structures - Chapter 2 - - 14 - E-mail : jwchang@jbnu.ac.kr 9. 탐색(Seeking) Low-level I/O 에서 탐색 기록/판독 포인터가 있는 곳으로부터, 원하는 위치로 이동 가능 화일 내에서 특정 위치로 직접 이동하는 행위가 seeking(탐색) Seek(Source_file, Offset, Position) Source_file Offset Position 탐색을 하고자 하는 논리적 화일 이름 화일의 시작으로부터 화일 포인터가 이동되기를 원하 는 거리의 크기 SEEK_SET: 파일 시작 SEEK_CUR: 현재 위치 SEEK_END: 파일 끝 lseek(fd, 300L, SEEK_SET) File Structures - Chapter 2 - - 15 - E-mail : jwchang@jbnu.ac.kr 9. 탐색(Seeking) C 스트림(High-level I/O)에서 탐색 fseek 사용 메모리 내에 있는 바이트의 배열에서 어떤 임의의 바이트로 이동 #define #define #define SEEK_SET 0 SEEK_CUR 1 SEEK_END 2 long pos; fseek(FILE *file, long offset, int origin); FILE *file; … pos = fseek(file, 372L, 0); // 화일에서 안으로 372바이트 위치로 이동 File Structures - Chapter 2 - - 16 - E-mail : jwchang@jbnu.ac.kr 9. 탐색(Seeking) C++ 스트림에서의 탐색 fstream 객체는 두 개의 화일 포인터 필요 입력을 위한 get 포인터와 출력을 위한 put 포인터 (seekg, seekp) 탐색 연산은 스트림 클래스의 메소드 (ios::beg(화일의 시작), ios::cur(현재의 위치), ios::end(화일의 끝)) file.seekg(373, ios::beg); file.seekp(377, ios::beg); // 373 바이트까지 포인터를 get과 put으로 움직인다. File Structures - Chapter 2 - - 17 - E-mail : jwchang@jbnu.ac.kr 10. The UNIX Directory Structure UNIX의 화일 시스템 모든 화일과 서브 디렉토리는 경로명에 의해 표현되는 트리구조 “.” : 현재 디렉토리 “..” : 현재 디렉토리의 부모 root bin adb cc usr yacc bin usr6 lib libc.a File Structures lib libm.c - Chapter 2 - dev mydir libdf.a consol addr kdb TAPE dF - 18 - E-mail : jwchang@jbnu.ac.kr 11. Physical Devices and Logical Files 화일로서의 물리적 장치 UNIX 에서 화일은 바이트의 열로서, 키보드나 콘솔같은 장치도 화일로 생각 UNIX 에서 화일이 어떤 물리적인 표현을 갖더라도, 화일에 대한 논리적인 관점은 동일 UNIX의 화일은 논리적으로 화일 기술자라는 정수로 표현 키보드, 디스크화일, 자기 테이프는 모두 정수로 표현 File Structures - Chapter 2 - - 19 - E-mail : jwchang@jbnu.ac.kr 11. Physical Devices and Logical Files 콘솔(console), 키보드(keyboard), 표준 에러 장치와 화일간의 이원성(duality) file = fopen(filename, “r”); while(fread(&ch, 1, 1, file) !=0 ) // 단계 // 단계 .a // 단계 .b fwrite(&ch, 1, 1, stdout); 논리적화일은 fopen 호출에 의해 돌려준(return) 값 단계3 에서 return 값을 변수 file에 대입 단계4.b 에서 stdout 은 기록하고자 하는 파일로서, 콘솔을 지칭함 stdin : 터미널의 키보드 stderr : 에러 화일로서 보통은 콘솔 File Structures - Chapter 2 - - 20 - E-mail : jwchang@jbnu.ac.kr 12. File-Related Header Files Low-level I/O fcntl.h, file. High-level I/O stdio.h C++ 스트림 fstream.h, iostream.h File Structures - Chapter 2 - - 21 - E-mail : jwchang@jbnu.ac.kr