SeoulTech 2011-2 nd 프로그래밍입문 (2) Chapter 12. Stream and File I/O 박종혁교수 (http://www.parkjonghyuk.net) Tel: 970-6702 Email: jhpark1@snut.ac.kr
Learning Objectives I/O Streams File I/O Character I/O Stream I/O 도구 입력 : 파일이름 서식출력, 플래그설정 Stream 계층 상속미리보기 파일 Random Access
개요 Streams 특수개체 프로그램입력및출력을제공 File I/O 상속을사용 File I/O 는매우유용하게사용
Streams 문자의흐름 입력스트림 프로그램흐름 키보드에서입력가능 파일에서입력가능 출력스트림 프로그램흐름 화면으로출력가능 파일로출력가능
Streams 사용 이미스트림을사용중 cin 키보드를통한스트림입력 cout 스크린을통한스트림출력 다른스트림정의 파일 cin, cout 과유사한사용
cin, cout 과유사한 stream 사용 고려 : 주어진프로그램이일부파일에서 instream 정의 : int thenumber; instream >> thenumber; thenumber 에할당된스트림에서값을읽음 프로그램에서정의한 outstream 으로파일에쓰기 outstream << "thenumber is " << thenumber; Stream 에저장된값을파일에쓰기
Files 텍스트파일사용 파일에서읽기 프로그램이입력을받을경우 파일에쓰기 프로그램이출력을내보낼경우 파일의처음부터시작해서끝까지 사용가능한다른방법 여기서는간단한텍스트파일액세스를다룸
File Connection 첫째로스트림객체와파일을연결 For input: File ifstream object For output: File ofstream object Classes ifstream and ofstream 라이브러리로정의된 <fstream> Std namespace
File I/O Libraries 프로그램의파일입출력을모두허용하려면 : #include <fstream> using namespace std; OR #include <fstream> using std::ifstream; using std::ofstream;
Streams 선언 스트림은다른클래스변수처럼선언 : ifstream instream; ofstream outstream; 파일과연결 : instream.open("infile.txt"); "opening the file open 멤버함수사용 전체경로명지정가능
Streams 사용 한번선언 일반적으로사용! int onenumber, anothernumber; instream >> onenumber >> anothernumber; 유사한출력스트림 : ofstream outstream; outstream.open("outfile.txt"); outstream 출력파일에항목을보냄 << "onenumber = " << onenumber << " anothernumber = " << anothernumber;
File Names 프로그램및파일 프로그램에서두개의파일이름을갖음 외부파일이름 물리적파일이름 Ex)"infile.txt" 때로는실제파일이름으로간주 열기위해프로그램에서한번사용 스트림이름 논리적파일이름 프로그램은모든파일작업에대해이이름을사용
Closing Files 다사용한파일은닫아야함 프로그램에서입력과출력이완료되면파일에서스트림연결을끊음 In action: instream.close(); outstream.close(); 프로그램이끝날때파일이자동으로종료
File Flush 출력은종종버퍼를사용 파일에기록하기전에일시적으로저장 필요에의해강제적으로쓰기가능 : outstream.flush(); flush 멤버함수는모든스트림출력에사용 모든버퍼출력은물리적으로작성 파일을닫으면자동으로 flush() 호출
File Example: Display 12.1 Simple File Input/Output (1 of 2)
File Example: Display 12.1 Simple File Input/Output (1 of 2)
Appending to a File 표준 open 은빈파일에서시작 파일이존재 내용분실 추가를위한 open: ofstream outstream; outstream.open("important.txt", ios::app); 파일이없음 파일생성 파일이존재 파일의끝에추가 2 번째인자인 ios 는 <iostream> 라이브러리에서지정
File Opens 을위한대체구문 선언에서파일이름을지정가능 생성자에인수로전달 ifstream instream; instream.open("infile.txt"); EQUIVALENT TO: ifstream instream("infile.txt");
Checking File Open Success 파일오픈은실패할수있음 파일이존재하지않는경우 파일에대한쓰기권한이없는경우 Unexpected results 멤버함수 fail() instream.open("stuff.txt"); if (instream.fail()) { cout << "File open failed.\n"; exit(1); }
문자 I/O with Files 모든 cin 과 cout 문자 I/O 는파일과같음 멤버함수 : get, getline put, putback, peek, ignore
Checking End of File 파일의끝까지 loop 전형적인방법 파일의끝을검사하는두가지방법 eof() 멤버함수 instream.get(next); while (!instream.eof()) { cout << next; instream.get(next); } 파일이끝날때까지문자를읽음 eof() 멤버함수는 BOOL 반환
End of File Check with Read 두번째방법 읽기작업에서 BOOL 값반환! (instream >> next) 성공적으로읽으면 true 반환 파일의끝을지나읽기를시도하면 false 반환 In action: double next, sum = 0; while (instream >> next) sum = sum + next; cout << "the sum is " << sum << endl;
Tools: 파일이름입력받기 스트림오픈작업 open() 에사용할 string 변수지정 char filename[16]; ifstream instream; cout << "Enter file name: "; cin >> filename; instream.open(filename); 더많은유연성제공
Formatting Output with Stream Functions 1 장의 "magic formula": cout.setf(ios::fixed); cout.setf(ios::showpoint); cout.precision(2); 모든출력스트림에사용가능 파일스트림은 cout 객체와동일한멤버함수를갖음
Output Member Functions 고려 : outstream.setf(ios::fixed); outstream.setf(ios::showpoint); outstream.precision(2); precision(x) 멤버함수 소수점뒤에 "x" 자리로작성된십진수 setf() 멤버함수 출력플래그의다양한설정허용
More Output Member Functions 고려 : outstream.width(5); width(x) 멤버함수 출력할너비를 "x 값으로지정 다음출력될값에만영향
Flags setf() 멤버함수 출력플래그의상태설정 모든출력스트림은 setf() 를멤버로갖음 플래그는 <iostream> 라이브러리에저장
setf() Examples 일반적인사용 : outstream.setf(ios::fixed); 십진수고정소수정 outstream.setf(ios::showpoint) 항상소수점포함 outstream.setf(ios::right); 오른쪽기준출력 프래그의다중사용 : outstream.setf(ios::fixed ios::showpoint ios::right);
조작자 조작자정의 : 기존과는다른새로운차원의방법으로호출하는함수 " 인자를가질수도가지지않을수도있음 삽입연산자다음에위치 멤버함수와동일한기능수행! 일반적으로조작자는멤버함수와같이사용 setw(), setprecision()
조작자 Example: setw() setw() 조작자 : cout << "Start" << setw(4) << 10 << setw(4) << 20 << setw(6) << 30; 결과 : Start 10 20 30 setw() 는오직다음에만영향
조작자 setprecision() setprecision() 조작자 : cout.setf(ios::fixed ios::showpoint); cout << "$" << setprecision(2) << 10.3 << " " << "$" << 20.5 << endl; 결과 : $10.30 $20.50
플래그값저장 플래그설정을변경할때까지유지 Precision, setf 프래그는현재설정을저장하거나원래설정으로복원가능 precision() 함수는인수없이호출되면현재설정반환 flags() 멤버함수도유사한기능제공
플래그값저장 Example void outputstuff(ofstream& outstream) { int precisionsetting = outstream.precision(); long flagsettings = outstream.flags(); outstream.setf(ios::fixed ios::showpoint); outstream.precision(2); outstream.precision(precisionsetting); outstream.flags(flagsettings); }
setf 기본값복원설정 기본값으로복원설정가능 : cout.setf(0, ios::floatfield); 디폴트값은플래그값이변경되기직전의설정값을의미하지않음 디폴트값은컴파일러구성에따라다름 precision 설정값을복원시키지않음 Only setf settings
계층적 Stream 구조 클래스에서의상속 파생클래스 다른클래스에서얻은하나의클래스 추가적인기능보유 Example: 입력파일스트림클래스는모든입력스트림클래스에서파생 Open, close 멤버함수추가 i.e.: ifstream is derived from istream
상속의실제예 컨버터블은자동차에서파생 모든컨버터블은자동차이다. 컨버터블은일반자동차와는다른특성을지닌다.
스트림클래스상속 클래스 D 가클래스 B 로부터파생 D 형의모든객체는 B 형객체 스트림 : ifstream 객체는 istream 객체 istream 을매개변수로사용 더많은객체에연결가능!
스트림클래스상속 Example
스트림클래스상속 Example Calls 이전기능을고려 : twosumversion1(filein); // Legal! twosumversion1(cin); // ILLEGAL! cin 는 ifstream형이아님! twosumversion2(filein); // Legal! twosumversion2(cin); // Legal! istream 인자는둘다사용가능
파일임의접근 순차접근 일반적인사용 임의접근 빠른접근 특별한데이터베이스소프트웨어에사용 파일임의의부분에접근 fstream 객체사용 input and output
임의접근 Tools Istream, ostream 과동일 두번째인자필요 fstream rwstream; rwstream.open("stuff", ios::in ios:: out); 두번째인자값은입력, 출력, 입출력모드인지여부알림 파일에대한이동 rwstream.seekp(1000); 파일의 1000 번째바이트위치 rwstream.seekg(1000); 1000 번째위치의포인터값
Random Access Sizes 파일에대한이동 사이즈를알아야함 sizeof() 연산은개체의바이트수결정 : sizeof(s) //Where s is string s = "Hello" sizeof(10) sizeof(double) sizeof(myobject) 100 번째의 MyStruct 형의레코드부분의포이터값 : rwstream.seekp(100*sizeof(mystruct) 1);
요약 1 open 연산으로스트림과파일을연결 fail() 멤버함수로파일 open 성공유무확인 스트림멤부함수포맷출력 e.g., width, setf, precision cout (screen), files 동일 함수는스트림형의매개변수보유가능 반드시 call-by-reference
요약 2 istream ("f 철자없음 ) cin, ifstream 매개변수사용가능 ostream ("f 철자없음 ) cout,ofstream 매개변수사용가능 Eof 멤버함수 입력파일의끝을검사하는데사용
Q&A 4-45