200 likes | 372 Views
컴퓨터공학 장 재 우 교수. Chapter 2. Fundamental File Processing Operations. Contents. Physical Files and Logical Files Opening Files Closing Files Reading and Writing Seeking The Unix Directory Structure Physical Devices and Logical Files File-Related Header Files.
E N D
컴퓨터공학 장 재 우 교수 Chapter 2. Fundamental File Processing Operations
Contents • Physical Files and Logical Files • Opening Files • Closing Files • Reading and Writing • Seeking • The Unix Directory Structure • Physical Devices and Logical Files • File-Related Header Files E-mail : jwchang@chonbuk.ac.kr
1. Physical Files and Logical Files • 물리적 화일 (Physical Files) • 디스크나 테이프 상에 있는 화일 • 논리적 화일 (Logical Files) • 운영체제(OS) 의 도움 E-mail : jwchang@chonbuk.ac.kr
2. Opening Files • 화일 열기의 Options • Opening existing file • Crete a new file • 이미 존재하는 화일 열기(open) • 화일을 프로그램에 의해 사용될 수 있도록 준비 • 시작위치는 화일의 처음으로 지정, 판독(read), 기록(write)준비 • 새로운 화일 생성(creat) • 생성 후에 화일이 사용될 준비가 된다는 점이 화일 열기와 동일 • 생성된 화일은 처음에는 내용이 없기에, 기록 연산만이 의미가 있음 E-mail : jwchang@chonbuk.ac.kr
인수 인수 인수 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 • 화일에 대한 보호 모드를 지정 Opening Files (계속) • fd = open(filename, flags[, pmode]) // fcntl.h E-mail : jwchang@chonbuk.ac.kr
(file open) write write write (file close) [buffer] [저장장치] 3. Closing Files • 화일 닫기 • 화일을 닫으면, 그 논리적 화일 이름은 다른 화일을 위해 사용 가능 • 화일을 닫는 것은, 그 화일을 위한 버퍼의 데이터가 비워지고 기록한 모든 것이 화일에 기록됨을 보장 E-mail : jwchang@chonbuk.ac.kr
4. Reading and Writing • 판독, 기록 함수 • 판독과 기록은 화일 처리의 기본, 화일 처리의 입출력(I/O) 연산으로 생성 • Read(Source_file, Destination_addr, Size) • Write(Destination_file, Source_addr, Size) Source_file 읽어야 할 정보가 있는 곳 Destination_addr 입력화일에서 읽은 정보를 저장할 곳 Size 화일에 가져올 정보의 크기 Destination_file 데이터를 보내기 위해 사용되는 논리적 화일 이름 Destination_addr 보내야 할 정보가 저장되어 있는 곳 Size 기록될 바이트의 갯수 E-mail : jwchang@chonbuk.ac.kr
인수 타입 설명 file FILE * • 화일 기술자(file descriptor)에 대한 포인터 • 타입 FILE 은 struct_iobuf를 위한 또 다른 이름 filename char * • 화일 이름 type char * • 열기 함수의 연산을 제어 “r”, “w”, “a”, “r+”, “w+”, “a+” Reading and Writing (계속) • C 스트림 (stdio.h) • file = fopen(filename, type) • 판독, 기록을 위한 연산 • fread, fget, fwrite, fput • fscanf, fprintf 함수는 입출력을 형식화하는데 사용 E-mail : jwchang@chonbuk.ac.kr
Reading and Writing (계속) • C++ 스트림 (iostream.h) • C++ 스트림(iostream.h) • C++에서 오버로딩 (>> (입력), << (출력)) • ostream& operator << (char c); • 예제 fstream(); // 스트림을 개방되지 않은 상태로 남겨둠 fstream(char *filename, int mode) int open(char *filename, int mode) int read(unsigned char * dest_addr, int size) int write(unsigned char *source_addr, int size) int n = 5; cout << “Value of n is “ << n << endl; E-mail : jwchang@chonbuk.ac.kr
Reading and Writing (계속) • 화일의 내용을 표시해 주는 C/C++ 프로그램 • [단계 1] 입력 화일의 이름을 물어 보는 프롬프트를 화면에 표시 • [단계 2] 사용자의 응답을 키보드에서 읽어서 file_name이라는 변수에 저장 • [단계 3] 입력 화일을 연다 • [단계 4] 입력 화일에서 읽을 문자들이 있는 동안 다음 작업을 반복[단계 4.a] 화일에서 문자를 읽고[단계 4.b] 터미날 스크린에 문자들을 쓴다 • [단계 5] 입력 화일을 닫는다 E-mail : jwchang@chonbuk.ac.kr
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 ) // .a fwrite(&ch, 1, 1,stdout); // .b fclose(file); // } <그림 2.2> listc.cpp E-mail : jwchang@chonbuk.ac.kr
Reading and Writing (계속) • 소스 예(C++ 언어) #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; cout << ch; } // .b file.close(); // } <그림 2.3> listcpp.cpp E-mail : jwchang@chonbuk.ac.kr
Reading and Writing (계속) • 화일 끝 (end_of_file)의 탐지 • 화일 끝을 알리는 조건 • fread 호출은 값으로 읽은 원소들의 수를 리턴 • fread가 0값을 되돌려 준다면, 화일의 끝에 도달 • file.fail() 은 화일의 끝에 도달했으면, 1 (참)을 리턴 E-mail : jwchang@chonbuk.ac.kr
5. Seeking • Sequential 판독과 Random 판독 • 기록/판독 포인터가 있는 곳으로부터, 원하는 위치로 이동 가능 • 화일 내에서 특정 위치로 직접 이동하는 행위가 seeking(탐색) Seek(Source_file, Offset) Source_file Offset 탐색을 하고자 하는 논리적 화일 이름 화일의 시작으로부터 화일 포인터가 이동되기를 원하는 거리의 크기 E-mail : jwchang@chonbuk.ac.kr
Seeking (계속) • C 스트림에서의 탐색 • 보조 기억장치에 저장된 매우 긴 바이트의 배열을 가정 • 탐색 : 메모리 내에 있는 바이트의 배열에서 첨자의 사용으로 어떤 임의의 바이트로 이동 #define SEEK_SET 0 #define SEEK_CUR 1 #define SEEK_END 2 long pos; fseek(FILE *file, long offset, int origin); FILE *file; … pos = fseek(file, 372L, 0); // 화일에서 안으로 372바이트 위치로 이동 E-mail : jwchang@chonbuk.ac.kr
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으로 움직인다. E-mail : jwchang@chonbuk.ac.kr
root bin usr usr6 dev adb cc yacc bin lib lib mydir consol kdb TAPE libc.a libm.c libdf.a addr dF 6. The UNIX Directory Structure • UNIX의 화일 시스템 • 모든 화일과 서브 디렉토리는, 경로명에 의해 표현되는 트리구조 “.” : 현재 디렉토리 “..” : 현재 디렉토리의 부모 E-mail : jwchang@chonbuk.ac.kr
7. Physical Devices and Logical Files • 화일로서의 물리적 장치 • UNIX 에서 화일은 바이트의 열로서, 키보드나 콘솔같은 장치도 화일로 생각 • UNIX 에서 화일이 어떤 물리적인 표현을 갖더라도, 화일에 대한 논리적인 관점은 동일 • UNIX의 화일은 논리적으로 화일 기술자라는 정수로 표현 • 키보드, 디스크화일, 자기 테이프는 모두 정수로 표현 E-mail : jwchang@chonbuk.ac.kr
Physical Devices and Logical Files (계속) • 콘솔(console), 키보드(keyboard), 표준 에러 • 장치와 화일간의 이원성(duality) • 논리적화일은 fopen 호출에 의해 돌려준 정수값 • 단계3 에서 정수 값을 변수 file에 대입 • 단계4.b 에서 stdout 은 기록하고자 하는 파일로서, 콘솔을 지칭함 • stdin : 터미널의 키보드 • stderr : 에러 화일로서 보통은 콘솔 file = fopen(filename, “r”); // 단계 while(fread(&ch, 1, 1, file) !=0 ) // 단계 .a fwrite(&ch, 1, 1,stdout); // 단계 .b E-mail : jwchang@chonbuk.ac.kr
8. File-Related Header Files • C 스트림 • stdio.h • C++ 스트림 • iostream.h, fstream.h • UNIX • fcntl.h, file.h E-mail : jwchang@chonbuk.ac.kr