chap12.ppt [호환 모드] - parkjonghyuk.net€¦ · 강의목표...

37
12파일 입력과 출력 12파일 입력과 출력 C++로 시작하는 객체지향 프로그래밍 1

Transcript of chap12.ppt [호환 모드] - parkjonghyuk.net€¦ · 강의목표...

Page 1: chap12.ppt [호환 모드] - parkjonghyuk.net€¦ · 강의목표 출력에ofstream(12.2.1)과입력에ifstream(12.2.2) 사용. 파일의존재여부테스트(12.2.3). 파일의끝(endoffile)(end

12장 파일 입력과 출력12장 파일 입력과 출력

C++로 시작하는 객체지향 프로그래밍 1

Page 2: chap12.ppt [호환 모드] - parkjonghyuk.net€¦ · 강의목표 출력에ofstream(12.2.1)과입력에ifstream(12.2.2) 사용. 파일의존재여부테스트(12.2.3). 파일의끝(endoffile)(end

강의 목표출력에 ofstream(12.2.1)과 입력에 ifstream(12.2.2) 사용.파일의 존재 여부 테스트(12.2.3).파일의 끝(end of file) 테스트(12 2 4)파일의 끝(end of file) 테스트(12.2.4).원하는 형식으로 데이터 쓰기(12.3).getline, get, put 함수를 사용하여 데이터 읽고 쓰기(12.4).데이터 읽고 쓰는데 fstream 객체 사용(12.5).지정된 형식으로 파일 열기(12.5).스트림 상태를 테스트하기 위해 eof(), fail(), bad(), good() 함수 사용(12.6).림 상태를 테 하기 위해 eo (), a (), bad(), good() 함수 사용( .6).텍스트(text) 입출력과 이진(binary) 입출력의 차이점 이해(12.7).write 함수를 사용한 이진 데이터 쓰기(12.7.1).

d 함수를 이용한 이진 데이터 읽기(12 7 2)read 함수를 이용한 이진 데이터 읽기(12.7.2).reinterpret_cast 연산자를 사용하여 문자 배열로 원시 유형 값과 객체의 형변환(12.7).배열과 객체 읽고 쓰기(12.7.3–12.7.4).임의 파일 접근(random file access)을 위해서 파일 포인터 이동에 seekp와 seekg 함수

사용(12.8).파일 내용 갱신(update)을 위해 입력과 출력 상태로 파일 열기(12.9).

C++로 시작하는 객체지향 프로그래밍 2

파일 내용 갱신(update)을 위해 입력과 출력 상태로 파일 열기(12.9).

Page 3: chap12.ppt [호환 모드] - parkjonghyuk.net€¦ · 강의목표 출력에ofstream(12.2.1)과입력에ifstream(12.2.2) 사용. 파일의존재여부테스트(12.2.3). 파일의끝(endoffile)(end

파일로 데이터 쓰기

ofstream 클래스는 텍스트 파일로 원시 데이터유형 값, 배열, 문자열, 객체를 쓰는데 사용된다. 리스트 12 1은 파일에 데이터를 쓰는 방법을리스트 12.1은 파일에 데이터를 쓰는 방법을설명하고 있다. 프로그램은 ofstream의인스턴스를 생성하고 “ t t” 파일에 두 줄을인스턴스를 생성하고 scores.txt” 파일에 두 줄을쓴다. 각 줄은 이름(문자열), 중간 이름이니셜(문자), 성(문자열), 점수(정수)로이루어져 있다.

TextFileOutput Run

C++로 시작하는 객체지향 프로그래밍 3

TextFileOutput Run

Page 4: chap12.ppt [호환 모드] - parkjonghyuk.net€¦ · 강의목표 출력에ofstream(12.2.1)과입력에ifstream(12.2.2) 사용. 파일의존재여부테스트(12.2.3). 파일의끝(endoffile)(end

파일로 데이터 쓰기

output << "John" << " " << "T" << "Smith" << " " << 90 << endl;

John T Smith 90

Eric K Jones 85

scores.txt

파일

output << "Eric" << " " << "K" << "Jones" << " " << 85 << endl;

C++로 시작하는 객체지향 프로그래밍 4

Page 5: chap12.ppt [호환 모드] - parkjonghyuk.net€¦ · 강의목표 출력에ofstream(12.2.1)과입력에ifstream(12.2.2) 사용. 파일의존재여부테스트(12.2.3). 파일의끝(endoffile)(end

파일 닫기파일 기

close() 함수(18번 줄)는 객체 스트림을close() 함수(18번 줄)는 객체 스트림을닫는데 사용되는데, 만약 이 함수가호출되지 않는다면 데이터가 파일에호출되지 않는다면 데이터가 파일에적절하게 저장되지 못 할 수도 있다. 적절하게 저장되지 못 할 수 있다

C++로 시작하는 객체지향 프로그래밍 5

Page 6: chap12.ppt [호환 모드] - parkjonghyuk.net€¦ · 강의목표 출력에ofstream(12.2.1)과입력에ifstream(12.2.2) 사용. 파일의존재여부테스트(12.2.3). 파일의끝(endoffile)(end

파일이 존재?파일이 재

만약 파일이 이미 존재한다면 파일의 내용이만약 파일이 이미 존재한다면 파일의 내용이경고 없이 지워질 것이다.

C++로 시작하는 객체지향 프로그래밍 6

Page 7: chap12.ppt [호환 모드] - parkjonghyuk.net€¦ · 강의목표 출력에ofstream(12.2.1)과입력에ifstream(12.2.2) 사용. 파일의존재여부테스트(12.2.3). 파일의끝(endoffile)(end

절대 경로 파일 이름절대 경 파일 이

모든 파일은 파일 시스템에서 디렉토리(폴더)에( )존재한다. 절대 경로 파일 이름(absolute file name)은드라이브 이름과 완전한 경로를 나타내는 파일이름이다. 예를 들어, c:₩example₩scores.txt는Windows 운영체제에서 scores.txt 파일에 대한 절대경로 파일 이름이 된다. 여기서 c:₩example은 파일이저장된 디렉토리(폴더) 경로이다. 절대 경로 파일( )이름은 컴퓨터 시스템에 따라 다른데, UNIX 시스템에서는 절대 경로 파일 이름을/home/liang/example/scores.txt와 같이 사용한다. 이는UNIX에서 scores.txt 파일이 /home/liang/example

C++로 시작하는 객체지향 프로그래밍 7

g p디렉토리에 존재한다는 것이다.

Page 8: chap12.ppt [호환 모드] - parkjonghyuk.net€¦ · 강의목표 출력에ofstream(12.2.1)과입력에ifstream(12.2.2) 사용. 파일의존재여부테스트(12.2.3). 파일의끝(endoffile)(end

파일 이름에서의 ₩파일 이 에서의

Windows에서 디렉토리(폴더) 구분자는Windows에서 디렉 리(폴더) 구분자는백슬래시(\, ₩)이다. 백슬래시는 C++에서는특별한 문자이기 때문에 문자열 리터럴에서는특별한 문자이기 때문에 문자열 리터럴에서는\\나 ₩₩로 사용되어야 한다(표 2.5 참조). 예를 들어예를 들어,

output.open("c:₩₩example₩₩scores.txt");

와 같이 사용해야 한다.

C++로 시작하는 객체지향 프로그래밍 8

와 같이 사용해야 한다.

Page 9: chap12.ppt [호환 모드] - parkjonghyuk.net€¦ · 강의목표 출력에ofstream(12.2.1)과입력에ifstream(12.2.2) 사용. 파일의존재여부테스트(12.2.3). 파일의끝(endoffile)(end

상대 경로 파일 이름상대 경 파일 이

절대 경로 파일 이름은 플랫폼에 의존적절대 경 파일 이름은 플랫폼에 의존적이라서 드라이브 이름이 없는 상대 경로 파일이름(relative file name)을 사용하는 것이 더이름(relative file name)을 사용하는 것이 더좋다. C++를 실행하기 위해서 통합 IDE를 사용중이라면 상대 경로 파일 이름의 디렉토리중이라면 상대 경로 파일 이름의 디렉토리(폴더)는 IDE 안에서 지정이 가능하다. 예를들어, 데이터 파일에 대한 기본 디렉토리(폴더) 는 Visual C++에서 소스 코드가 존재하는 같은는 에서 가 존재하는 같은디렉토리(폴더)가 된다.

C++로 시작하는 객체지향 프로그래밍 9

Page 10: chap12.ppt [호환 모드] - parkjonghyuk.net€¦ · 강의목표 출력에ofstream(12.2.1)과입력에ifstream(12.2.2) 사용. 파일의존재여부테스트(12.2.3). 파일의끝(endoffile)(end

파일로부터 데이터 읽기파일 부터 데이터 읽기

ifstream 클래스는 텍스트 파일로부터 데이터를ifstream 클래 는 텍 파일 부터 데이터를읽기 위해 사용된다. 리스트 12.2는 데이터를읽는 방법을 설명하고 있다 프로그램은읽는 방법을 설명하고 있다. 프로그램은ifstream의 인스턴스를 생성하고, scores.txt 파일로부터 데이터를 읽는다 파일은파일로부터 데이터를 읽는다. scores.txt 파일은이전 예제에서 생성되었다.

TextFileInput Run

C++로 시작하는 객체지향 프로그래밍 10

TextFileInput Run

Page 11: chap12.ppt [호환 모드] - parkjonghyuk.net€¦ · 강의목표 출력에ofstream(12.2.1)과입력에ifstream(12.2.2) 사용. 파일의존재여부테스트(12.2.3). 파일의끝(endoffile)(end

파일 존재 여부 테스트파일 재 여부 테

만일 파일로부터 데이터를 읽을 때 파일이만일 파일 부터 데이터를 읽을 때 파일이존재하고 있지 않다면, 프로그램의 실행 후올바르지 못한 결과를 나타낼 것이다 그렇다면올바르지 못한 결과를 나타낼 것이다. 그렇다면프로그램에서 파일이 존재하고 있는지의여부를 검사할 수 있을까? 이는 함수를여부를 검사할 수 있을까? 이는 open 함수를호출한 후 즉시 fail() 함수를 호출함으로써가능하다. fail()이 참을 반환하면 파일이존재하지 않는다는 것을 의미한다.존재하지 않는다는 것을 의미한다

C++로 시작하는 객체지향 프로그래밍 11

Page 12: chap12.ppt [호환 모드] - parkjonghyuk.net€¦ · 강의목표 출력에ofstream(12.2.1)과입력에ifstream(12.2.2) 사용. 파일의존재여부테스트(12.2.3). 파일의끝(endoffile)(end

파일의 끝 테스트파일의 끝 테

리스트 12.2는 데이터 파일로부터 두 줄을리 12.2는 데이터 파일 부터 두 줄을읽는다. 파일 안에 얼마나 많은 줄이 있는지모르고 있는 상태에서 파일 안의 모든 데이터를모르고 있는 상태에서 파일 안의 모든 데이터를읽고자 할 때, 파일의 끝을 어떻게 알 수있을까? 이는 입력 객체에 대하여 f() 함수를있을까? 이는 입력 객체에 대하여 eof() 함수를호출하면 가능하다. 리스트 12.3은 scores.txt 파일로부터 모든 줄의 데이터를 읽기 위해서리스트 12.2를 수정한 것이다.리 를 수정한 것이다

TestEndOfFile Run

C++로 시작하는 객체지향 프로그래밍 12

TestEndOfFile Run

Page 13: chap12.ppt [호환 모드] - parkjonghyuk.net€¦ · 강의목표 출력에ofstream(12.2.1)과입력에ifstream(12.2.2) 사용. 파일의존재여부테스트(12.2.3). 파일의끝(endoffile)(end

데이터 형식 알기데이터 형식 알기

데이터를 올바르게 읽기 위해서 데이터가데이터를 올바 게 읽기 위해서 데이터가어떻게 저장되어 있는지를 정확히 알아야 한다. 예를 들어 리스트 12 3 프로그램에서 점수가예를 들어, 리스트 12.3 프로그램에서 점수가소수점을 가진 double 형 값으로 저장되어있다면 바르게 동작하지 않을 것이다있다면 바르게 동작하지 않을 것이다.

C++로 시작하는 객체지향 프로그래밍 13

Page 14: chap12.ppt [호환 모드] - parkjonghyuk.net€¦ · 강의목표 출력에ofstream(12.2.1)과입력에ifstream(12.2.2) 사용. 파일의존재여부테스트(12.2.3). 파일의끝(endoffile)(end

출력 형식 지정출력 형식 지정

3.12절 “출력 형식 지정”에서 화면으로의 출력3.12절 출력 형식 지정 에서 화면 의 출력형식을 지정하기 위해 스트림 조절자(manipulator)를 사용하였다 파일로의 출력(manipulator)를 사용하였다. 파일로의 출력형식 지정에도 같은 스트림 조절자를 사용할 수있다 리스트 12 4는 f d 파일에있다. 리스트 12.4는 formattedscores.txt 파일에대해 학생 레코드의 출력 형식을 지정하는예이다.

WriteFormatData Run

C++로 시작하는 객체지향 프로그래밍 14

WriteFormatData Run

Page 15: chap12.ppt [호환 모드] - parkjonghyuk.net€¦ · 강의목표 출력에ofstream(12.2.1)과입력에ifstream(12.2.2) 사용. 파일의존재여부테스트(12.2.3). 파일의끝(endoffile)(end

getline, get, putg , g , p스트림 추출 연산자(stream extraction operator, >>)를( p , )

사용하여 데이터를 읽는 것은 문제가 있는데, 데이터는 공백(whitespace)으로 각각의 경계가( p )정해진다. 공백 문자가 문자열의 한 부분이라면 어떤일이 발생하는가? 7.9.3절 “문자열 읽기”에서 공백이있는 문자열을 읽기 위해 getline 함수를 사용하는방법을 배웠다. 파일에서 문자열을 읽기 위해서도 이함수를 사용할 수 있다. getline 함수에 대한 구문을다시 쓰면 다음과 같다.

getline(char array[], int size, char delimitChar)

R dCi RC++로 시작하는 객체지향 프로그래밍 15

ReadCity Run

Page 16: chap12.ppt [호환 모드] - parkjonghyuk.net€¦ · 강의목표 출력에ofstream(12.2.1)과입력에ifstream(12.2.2) 사용. 파일의존재여부테스트(12.2.3). 파일의끝(endoffile)(end

getline, get, putg , g , p두 가지 유용한 함수로 get과 put이 있다. 입력두 가지 유용한 함수 get과 put이 있다. 입력

객체로 문자를 읽히기 위해서 get 함수를호출하고 출력 객체로 문자를 쓰기 위해 put호출하고 출력 객체로 문자를 쓰기 위해 put함수를 호출할 수 있다.

CopyFile Run

C++로 시작하는 객체지향 프로그래밍 16

CopyFile Run

Page 17: chap12.ppt [호환 모드] - parkjonghyuk.net€¦ · 강의목표 출력에ofstream(12.2.1)과입력에ifstream(12.2.2) 사용. 파일의존재여부테스트(12.2.3). 파일의끝(endoffile)(end

fstream과 파일 열기 모드과 파일 열기앞 절에서 데이터를 쓰기 위해서 ofstream을,

데이터를 읽기 위해서는 if 을 사용하였다데이터를 읽기 위해서는 ifstream을 사용하였다. 이를 대신하여 입력 스트림이나 출력 스트림을생성하기 위해 fstream 클래스를 사용할 수도있다. 만약 프로그램이 입력과 출력 모두에있다 만약 램이 입력과 출력 두에대해 같은 스트림 객체를 사용해야 한다면fstream을 사용하는 것이 편리하다 fstreamfstream을 사용하는 것이 편리하다. fstream파일을 열기 위해서는 파일이 어떻게 사용될것인지를 C++에게 알려주도록 파일 모드(fil것인지를 C++에게 알려주도록 파일 모드(file mode)를 지정해야 한다. 파일 모드 목록이 표

C++로 시작하는 객체지향 프로그래밍 17

12.1에 나타나있다.

Page 18: chap12.ppt [호환 모드] - parkjonghyuk.net€¦ · 강의목표 출력에ofstream(12.2.1)과입력에ifstream(12.2.2) 사용. 파일의존재여부테스트(12.2.3). 파일의끝(endoffile)(end

파일 모드파일

모드 설명모드 설명

ios::in 입력을 위해 파일 열기.

ios::out 출력을 위해 파일 열기.

ios::app 파일의 끝에 출력을 추가.

ios::ate출력을 위해 파일을 열기. 만약 파일이 이미 존재한다면 파일의 끝으로

이동. 데이터는 파일의 아무 곳이나 쓰기가 가능.이동. 데이터는 파일의 아무 곳이나 기가 가능.

ios::truct파일 이미 존재한다면 파일의 내용을 버림. (이는 ios::out에 대해 기본 동

작임)작임)

ios::binary 이진 입력과 출력을 위해 파일 열기.

C++로 시작하는 객체지향 프로그래밍 18

Page 19: chap12.ppt [호환 모드] - parkjonghyuk.net€¦ · 강의목표 출력에ofstream(12.2.1)과입력에ifstream(12.2.2) 사용. 파일의존재여부테스트(12.2.3). 파일의끝(endoffile)(end

결합 모드결

몇몇 모드는 비트 OR 연산자인 |와 함께 결합될 수|있다. 비트 OR 연산자에 대한 자세한 사항은 부록 D, “비트 연산”을 보기 바란다. 예를 들어, city.txt 파일을, y출력을 위해 열고 데이터를 추가하도록 하는 것은다음 문장을 실행하면 된다:

stream open("city txt" ios::out | ios::app);stream.open( city.txt , ios::out | ios::app);

AppendFile Run

C++로 시작하는 객체지향 프로그래밍 19

AppendFile Run

Page 20: chap12.ppt [호환 모드] - parkjonghyuk.net€¦ · 강의목표 출력에ofstream(12.2.1)과입력에ifstream(12.2.2) 사용. 파일의존재여부테스트(12.2.3). 파일의끝(endoffile)(end

스트림 상태 테스트스트림 상태 테스트

스트림의 상태를 테스트하기 위해서 eof()스트림의 상태를 테스트하기 위해서 eof()함수와 fail() 함수를 사용했는데, C++에서는스트림 상태 테스트를 위한 더 많은 함수를스트림 상태 테스트를 위한 더 많은 함수를제공하고 있다. 각 스트림 객체는 플래그(flag)로동작하는 일련의 비트를 가지고 있다. 이들 비트값(0 또는 1)은 스트림의 상태를 나타내 주고값(0 또는 1)은 스트림의 상태를 나타내 주고있는데, 이들 비트 목록이 표 12.2에 나타나있다있다.

C++로 시작하는 객체지향 프로그래밍 20

Page 21: chap12.ppt [호환 모드] - parkjonghyuk.net€¦ · 강의목표 출력에ofstream(12.2.1)과입력에ifstream(12.2.2) 사용. 파일의존재여부테스트(12.2.3). 파일의끝(endoffile)(end

스트림 상태 비트 값스트림 상태 비트 값

비트 설명비트 설명

ios::eofbit 입력 스트림의 끝을 만나면 1이 됨ios::eofbit 입력 스트림의 끝을 만나면 1이 됨

ios::failbit 동작이 실패하면 1이 됨

ios::hardfail 회복할 수 없는 오류가 발생하면 1이 됨.

ios::badbit 유효하지 않은 동작이 시도될 때 1이 됨.

동작이 성공하면 이 됨ios::goodbit 동작이 성공하면 1이 됨.

C++로 시작하는 객체지향 프로그래밍 21

Page 22: chap12.ppt [호환 모드] - parkjonghyuk.net€¦ · 강의목표 출력에ofstream(12.2.1)과입력에ifstream(12.2.2) 사용. 파일의존재여부테스트(12.2.3). 파일의끝(endoffile)(end

스트림 상태 함수스트림 상태 함수

함수 설명함수 설명

eof() eofbit 플래그가 1이면 참을 반환() 플래 가 이면 참을 반환

fail() failbit 또는 hardfail 플래그가 1이면 참을 반환

bad() badbit가 1이면 참을 반환

가 이면 참을 반환good() goodbit가 1이면 참을 반환

clear() 모든 플래그 값을 지움

ShowStreamState Run

clear() 모든 플래그 값을 지움

C++로 시작하는 객체지향 프로그래밍 22

ShowStreamState Run

Page 23: chap12.ppt [호환 모드] - parkjonghyuk.net€¦ · 강의목표 출력에ofstream(12.2.1)과입력에ifstream(12.2.2) 사용. 파일의존재여부테스트(12.2.3). 파일의끝(endoffile)(end

이진 입출력이진 입출력기술적으로 정확한 표현은 아니지만, 텍스트 파일은기술적 정확한 현은 아니지만, 텍 파일은

문자들의 연속으로 구성되어 있고, 이진 파일은 비트의연속으로 구성되어 있다고 생각할 수 있다. 예를 들어, 연속 구성되어 있다 생각할 수 있다 예를 들어,10진수 199는 텍스트 파일 안에서는 3개의 문자, ‘1’, ‘9’, ‘9’의 연속으로 저장되어 있고, 이진 파일에서는, 의 속 저장되어 있 , 이 파일에서10진수 199가 16진수 C7(199 = 12 × 161 + 7)과같으므로 바이트 유형의 값 C7로 저장된다.바이 유형의 저장 다

C++로 시작하는 객체지향 프로그래밍 23

Page 24: chap12.ppt [호환 모드] - parkjonghyuk.net€¦ · 강의목표 출력에ofstream(12.2.1)과입력에ifstream(12.2.2) 사용. 파일의존재여부테스트(12.2.3). 파일의끝(endoffile)(end

텍스트와 이진 입출력텍스트와 이진 입출력

컴퓨터는 이진 파일과 텍스트 파일을 구분하지컴퓨터는 이진 파일과 텍스트 파일을 구분하지않는다. 모든 파일은 이진 형태로 저장된다. 따라서 모든 파일은 본질적으로 이진 파일이다따라서 모든 파일은 본질적으로 이진 파일이다. 텍스트 입출력에 대해 자동적으로부호화( di )와 복호화(d di )를부호화(encoding)와 복호화(decoding)를수행하여 텍스트 입출력(I/O)을 이진입출력으로 만든다.

C++로 시작하는 객체지향 프로그래밍 24

Page 25: chap12.ppt [호환 모드] - parkjonghyuk.net€¦ · 강의목표 출력에ofstream(12.2.1)과입력에ifstream(12.2.2) 사용. 파일의존재여부테스트(12.2.3). 파일의끝(endoffile)(end

ios::binaryios::binary 이진 입출력은 변환이 필요하지 않다. 만약 이진

입출력을 사용하여 파일에 숫자를 쓴다면 메모리의값이 그대로 파일로 복사된다. C++에서 이진 입출력을수행하려면 ios::binary 이진 모드를 사용하여 파일을열어야 한다. 기본적으로 파일은 텍스트 모드로열린다.

텍스트 파일에 데이터를 쓰기 위해서 << 연산자와put 함수를 사용했고, 텍스트 파일로부터 데이터를읽기 위해서는 >> 연산자와 get, getline 함수를g g사용하였다. 이진 파일에서 데이터를 읽거나 이진파일로 데이터를 쓰기 위해서는 스트림에 read와 write

C++로 시작하는 객체지향 프로그래밍 25

함수를 사용해야 한다.

Page 26: chap12.ppt [호환 모드] - parkjonghyuk.net€¦ · 강의목표 출력에ofstream(12.2.1)과입력에ifstream(12.2.2) 사용. 파일의존재여부테스트(12.2.3). 파일의끝(endoffile)(end

write 함수write 함수

write 함수에 대한 구문은 다음과 같다.write 함수에 대한 구문은 다음과 같다.

streamObject.write(char * address, int size)

리스트 12.9는 write 함수를 사용하는 예를보여주고 있다보여주고 있다.

BinaryCharOutput Run

C++로 시작하는 객체지향 프로그래밍 26

BinaryCharOutput Run

Page 27: chap12.ppt [호환 모드] - parkjonghyuk.net€¦ · 강의목표 출력에ofstream(12.2.1)과입력에ifstream(12.2.2) 사용. 파일의존재여부테스트(12.2.3). 파일의끝(endoffile)(end

문자 이외 데이터 쓰기문자 이외 데이터 쓰기문자 이외의 다른 데이터를 써야 할 경우, 이를

어떻게 실행할 수 있을까 이 적을 위해어떻게 실행할 수 있을까? C++는 이 목적을 위해reinterpret_cast를 제공하고 있다. 이진 입출력을 위한문자 배열 인터 원시 유형 값이나 객체의 소를문자 배열 포인터로 원시 유형 값이나 객체의 주소를형변환하기 위해 이 연산자를 사용할 수 있다. 이와같은 형변환의 구문은 다음과 같다같은 형변환의 구문은 다음과 같다.

reinterpret cast<dataType>(address)reinterpret_cast<dataType>(address)

여기서 address는 데이터(원시, 배열, 객체)의 시작주소이고 은 변환하려는 데이터 유형으로서주소이고, dataType은 변환하려는 데이터 유형으로서이진 입출력에 대해서는 char *가 된다.

C++로 시작하는 객체지향 프로그래밍 27

BinaryIntOutput Run

Page 28: chap12.ppt [호환 모드] - parkjonghyuk.net€¦ · 강의목표 출력에ofstream(12.2.1)과입력에ifstream(12.2.2) 사용. 파일의존재여부테스트(12.2.3). 파일의끝(endoffile)(end

read 함수read 함수read 함수에 대한 구문은 다음과 같다.

streamObject.read(char * address, int size)streamObject.read(char address, int size)

city dat 파일이 리스트 12 9에서 생성되었다고city.dat 파일이 리스트 12.9에서 생성되었다고가정했을 때, 리스트 12.11은 read 함수를사용하여 i d 파일로부터 문자를 읽는사용하여 city.dat 파일로부터 문자를 읽는프로그램이다.

hC++로 시작하는 객체지향 프로그래밍 28

BinaryCharInput Run

Page 29: chap12.ppt [호환 모드] - parkjonghyuk.net€¦ · 강의목표 출력에ofstream(12.2.1)과입력에ifstream(12.2.2) 사용. 파일의존재여부테스트(12.2.3). 파일의끝(endoffile)(end

문자 이외 데이터 읽기문자 이외 데이터 읽기마찬가지로 문자 이외의 다른 데이터를 읽기

위해서는 reinterpret_cast 연산자를 사용해야하는데, temp.dat 파일이 리스트 12.10에서하는데, temp.dat 파일이 리스트 12.10에서생성되었다고 가정하고, 리스트 12.12 프로그램에서는 read 함수를 사용하여 정수를프로그램에서는 read 함수를 사용하여 정수를읽는다.

C++로 시작하는 객체지향 프로그래밍 29

BinaryIntInput Run

Page 30: chap12.ppt [호환 모드] - parkjonghyuk.net€¦ · 강의목표 출력에ofstream(12.2.1)과입력에ifstream(12.2.2) 사용. 파일의존재여부테스트(12.2.3). 파일의끝(endoffile)(end

이진 배열 입출력이진 배열 입출력이 절은 이진 파일로 double 값의 배열을 쓰고,

그 파일로부터 다시 데이터를 읽는 리스트 12.13 프로그램을 설명한다.프로그램을 설명한다.

C++로 시작하는 객체지향 프로그래밍 30

BinaryArrayIO Run

Page 31: chap12.ppt [호환 모드] - parkjonghyuk.net€¦ · 강의목표 출력에ofstream(12.2.1)과입력에ifstream(12.2.2) 사용. 파일의존재여부테스트(12.2.3). 파일의끝(endoffile)(end

이진 객체 입출력이진 객체 입출력

리스트 12 1은 텍스트 파일로 학생 레코드를리스트 12.1은 텍스트 파일로 학생 레코드를쓰는 프로그램이었다. 학생 레코드는 이름, 중간이름 이니셜 성 점수로 이루어져 있다 이들이름 이니셜, 성, 점수로 이루어져 있다. 이들필드는 파일에 구분되어 기록되어 있다. 데이터의 처리를 더 좋게 하기 위해서는데이터의 처리를 더 좋게 하기 위해서는레코드를 모델링하도록 클래스를 선언하면된다. 각 레코드는 Student 클래스의 객체이다.

Student.h

RunStudent cpp BinaryObjectIO

C++로 시작하는 객체지향 프로그래밍 31

RunStudent.cpp BinaryObjectIO

Page 32: chap12.ppt [호환 모드] - parkjonghyuk.net€¦ · 강의목표 출력에ofstream(12.2.1)과입력에ifstream(12.2.2) 사용. 파일의존재여부테스트(12.2.3). 파일의끝(endoffile)(end

이진 객체 입출력(계속)

Student

-firstName: string 학생의 이름

-mi: char -lastName: string -score: double

학생의 중간 이름 이니셜

학생의 성

학생의 점수

+Student() +Student(firstName: string, mi: char,

lastName: string, score: int) +getFirstName(): string

기본 Student 객체 생성

지정된 이름, 중간 이름 이니셜, 성, 점수로

student 생성

학생의 이름 반환g () g+getMi(): char +getLastName(): string +getScore(): int + tFi tN ( t i ) id

학생의 이름 반환

학생의 중간 이름 이니셜 반환

학생의 성 반환

학생의 점수 반환

학생의 새로운 이름 설정+setFirstName(s: string): void+setMi(ch: char): void +setLastName(s: string): void +setScore(score: int): void

학생의 새로운 이름 설정

학생의 새로운 중간 이름 이니셜 설정

학생의 새로운 성 설정

학생의 새로운 점수 설정

Student.h

RunStudent cpp BinaryObjectIO

C++로 시작하는 객체지향 프로그래밍 32

RunStudent.cpp BinaryObjectIO

Page 33: chap12.ppt [호환 모드] - parkjonghyuk.net€¦ · 강의목표 출력에ofstream(12.2.1)과입력에ifstream(12.2.2) 사용. 파일의존재여부테스트(12.2.3). 파일의끝(endoffile)(end

임의 접근 파일파일은 바이트의 연속으로 구성되어 있다.

이들 바이트 중 한 곳에는 파일 포인터(file이들 바이트 중 한 곳에는 파일 포인터(file pointer)라고 하는 특별한 표식이 있는데, 읽기나쓰기 동작은 파일 포인터의 위치에서 발생한다쓰기 동작은 파일 포인터의 위치에서 발생한다. 파일이 열리면 파일 포인터는 파일의 첫 위치로설정되고, 파일에서 데이터를 읽거나 쓰기를하면 파일 포인터가 다음 데이터 항목으로하면 파일 포인터가 다음 데이터 항목으로이동하게 된다. 예를 들어, get() 함수를사용하여 문자를 읽으면 C++는 파일사용하여 문자를 읽으면 C++는 파일포인터로부터 한 바이트를 읽고, 그 다음, 파일포인터는 1 바이트 다음 위치로 이동하게 된다

C++로 시작하는 객체지향 프로그래밍 33

포인터는 1 바이트 다음 위치로 이동하게 된다.

Page 34: chap12.ppt [호환 모드] - parkjonghyuk.net€¦ · 강의목표 출력에ofstream(12.2.1)과입력에ifstream(12.2.2) 사용. 파일의존재여부테스트(12.2.3). 파일의끝(endoffile)(end

임의 접근 파일(계속)

파일 포인터

byte 파일 byte … byte byte byte byte byte … byte byte byte byte byte

파일 인터

(a) get() 실행 전

byte 파일 byte … byte byte byte byte byte … byte byte byte byte byte

파일포인터

(b) get() 실행 후

C++로 시작하는 객체지향 프로그래밍 34

Page 35: chap12.ppt [호환 모드] - parkjonghyuk.net€¦ · 강의목표 출력에ofstream(12.2.1)과입력에ifstream(12.2.2) 사용. 파일의존재여부테스트(12.2.3). 파일의끝(endoffile)(end

seekp, seekg, tellp, tellgp, g, p, g탐색 기준 설명

ios::beg 파일의 시작 위치로부터 오프셋을 계산

ios::end 파일의 끝으로부터 오프셋 계산

ios::cur 현재 파일 포인터로부터 오프셋 계산

문장 설명문장 설명

seekg(100L, ios::beg); 파일의 시작 위치로부터 100번째 바이트로 파일 포인터를 이동

k ( 100L i d) 파일의 끝으로부터 거꾸로 100번째 바이트로 파일 포인터를 이동seekg(-100L, ios::end); 파일의 끝으로부터 거꾸로 100번째 바이트로 파일 포인터를 이동

seekp(42L, ios::cur);현재 파일 포인터로부터 전방(파일의 끝 쪽)으로 42번째 바이트만큼파일 포인터 이동

seekp(-42L, ios::cur);현재 파일 포인터로부터 후방(파일의 앞 쪽)으로 42번째 바이트만큼파일 포인터 이동

C++로 시작하는 객체지향 프로그래밍 35

seekp(100L); 파일에서 100번째 바이트로 파일 포인트 이동

Page 36: chap12.ppt [호환 모드] - parkjonghyuk.net€¦ · 강의목표 출력에ofstream(12.2.1)과입력에ifstream(12.2.2) 사용. 파일의존재여부테스트(12.2.3). 파일의끝(endoffile)(end

임의 접근 파일 예의 파일 예

리스트 12.17은 파일을 어떻게 임의적으로리 12.17은 파일을 어떻게 임의적접근할 수 있는지를 설명하고 있다. 프로그램은먼저 파일에 10개의 student 객체를 저장하고먼저 파일에 10개의 student 객체를 저장하고, 파일로부터 3번째 학생을 검색한다.

RunRandomAccessFile

C++로 시작하는 객체지향 프로그래밍 36

RunRandomAccessFile

Page 37: chap12.ppt [호환 모드] - parkjonghyuk.net€¦ · 강의목표 출력에ofstream(12.2.1)과입력에ifstream(12.2.2) 사용. 파일의존재여부테스트(12.2.3). 파일의끝(endoffile)(end

파일 갱신파일 갱

리스트 12.18은 파일을 갱신하는 방법에 대해설명하고 있다. 리스트 12.17에서 object1.dat 파일이 이미 10개의 Student 객체를 가지고파일이 이미 10개의 Student 객체를 가지고생성되었다고 가정한다. 프로그램은 먼저파일로부터 3번째 학생을 읽고 성(last name)을파일로부터 3번째 학생을 읽고 성(last name)을변경한 다음, 파일의 객체를 수정한다. 그 다음, 파일로부터 새로운 객체를 읽는다파일로부터 새로운 객체를 읽는다.

RunUpdateFile

C++로 시작하는 객체지향 프로그래밍 37

RunUpdateFile