Uploaded by 오한슬

2장-강의

advertisement
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
Download