금오공과대학교 C++ 프로그래밍 jhhwang@kumoh.ac.kr 컴퓨터공학과 황준하
16 강. 파일입출력목차 파일입출력기초 파일입출력모드 텍스트파일과이진파일 이진파일입출력 임의접근 1 /18
16 강. 파일입출력파일입출력기초 파일입출력과정 파일스트림객체생성 파일열기 사용 : 기본적으로표준입출력객체 (cin, cout) 사용방법과동일 파일닫기 파일스트림클래스의종류 파일출력스트림클래스 : ofstream 파일입력스트림클래스 : ifstream 파일입출력스트림클래스 : fstream 2 /18
16 강. 파일입출력파일입출력기초 파일출력예 파일스트림클래스포함 파일출력객체생성 #include <iostream> #include <fstream> using namespace std; ofstream fout; 파일열기 ( 연결 ) fout.open("a.txt"); cout 과동일하게사용 파일닫기 ( 연결해제 ) for (int i = 0; i < 10; i++) fout << i << " "; fout << endl; fout.close(); 3 /18
16 강. 파일입출력파일입출력기초 파일입력예 a.txt 로부터정수읽기 파일입력객체생성 파일열기 ( 연결 ) cin 과동일하게사용 ifstream fin; fin.open("a.txt"); int Sum = 0; int Num; for (int i = 0; i < 10; i++) fin >> Num; Sum += Num; cout << " 합계 : " << Sum << endl; 파일닫기 ( 연결해제 ) fin.close(); 4 /18
16 강. 파일입출력파일입출력모드 입출력스트림클래스의생성자 스트림객체생성과동시에파일열기 ( 연결 ) 가능 ofstream(char *filename, int mode = ios_base::out) ifstream(char *filename, int mode = ios_base::in) fstream(char *filename, int mode = ios_base::in ios_base::out) 파일입출력모드 파일 : 공유자원 파일사용권한획득필요 읽기, 쓰기, 읽기쓰기등모든설정 ofstream fout("a.txt"); fout << 123 << endl; fout.close(); 5 /18
16 강. 파일입출력파일입출력모드 파일입출력모드 fio.open( filename, Mode); 파일열기모드 : 읽기, 쓰기등 파일접근모드 : 텍스트, 이진 6 /18 모드 ( 상수 ) ios_base::in ios_base::out ios_base::ate ios_base::app ios_base::trunc ios_base::binary 입력 의미 출력, 이모드만설정시자동으로 ios_base::trunc 적용 파일 open 시입출력포인터 ( 현재읽기쓰기위치 ) 를파일끝으로이동, 모든위치에서읽고쓰고가능 파일읽기는모든위치에서가능, 쓰기는파일의마지막위치에추가만가능 해당파일이존재할경우파일의내용모두삭제 이진모드로열기
16 강. 파일입출력파일입출력모드 Ios_base::app 사용예 fstream fio("a.txt", ios_base::in ios_base::out ios_base::app); for (int i = 10; i < 20; i++) fio << i << " "; fio << endl; 데이터추가 마지막에추가 fio.seekg(0, ios_base::beg); 입력포인터 ( 읽기위치 ) 를처음으로이동 7 /18 int Sum = 0; int Num; for (int i = 0; i < 20; i++) fio >> Num; Sum += Num; cout << " 합계 : " << Sum << endl; fio.close(); 임의접근에서자세히설명 데이터읽기및확인
16 강. 파일입출력파일입출력모드 텍스트모드와이진모드 텍스트모드 : \n \r\n 두자로변환하여처리 이진모드 : \n \n 그대로처리 ofstream fout("a.txt"); fout << "123" << endl; fout.close(); ofstream fout("a.txt", ios_base::out ios_base::binary); fout << "123" << endl; fout.close(); 5byte : 123\r\n 4byte : 123\n 8 /18
16 강. 파일입출력텍스트파일과이진파일 메모리의데이터를파일로저장하는방법 문자화하여사람이읽기쉽게저장 텍스트파일 메모리의내용그대로파일로저장 이진파일 예 : int a = 15; 에서 a 의값 15 를파일로저장하는방법 15 2 문자 (2byte) 로 저장 4byte 메모리형태그대로 저장 다시 4byte 만큼읽어서 int 변수에저장하면 15 임 9 /18
16 강. 파일입출력텍스트파일과이진파일 텍스트파일과이진파일을만들고사용하는방법 파일스트림클래스의멤버함수의차이 << 연산자 : 텍스트파일로출력 >> 연산자 : 텍스트파일로입력 write 함수 : 이진파일로저장 read 함수 : 이진파일로입력 참고사항 파일열기모드 ( 텍스트모드, 이진모드 ) 와텍스트파일, 이진파일은원칙적으로무관함 그러나, 일반적으로텍스트파일은텍스트모드로열고, 이진파일은이진모드로열어작업 10 /18
16 강. 파일입출력이진파일입출력 read, write 멤버함수 istream &read(char *buffer, int size); ostream &write(char *buffer, int size); buffer : 입력또는출력데이터를저장할변수의주소 size : 데이터의크기 ( 바이트단위 ) ofstream fout("a.txt", ios_base::out ios_base::binary); int a = 15; fout.write((char *) &a, sizeof(int)); fout.close(); a 의시작주소로부터시작해서 4 바이트 (int) 만큼을 파일로저장 a 의값을메모리형태그대로저장 11 /18
16 강. 파일입출력이진파일입출력 read 함수사용예 ifstream fin("a.txt", ios_base::in ios_base::binary); int a; fin.read((char *) &a, sizeof(int)); cout << a << endl; fin.close(); 4 바이트 (int) 만큼파일로부터데이터를읽어 메모리의변수 a 의시작주소에저장함 int 값하나를읽어 a 에저장 12 /18
16 강. 파일입출력이진파일입출력 배열데이터의이진파일입출력예 ofstream fout("a.txt", ios_base::out ios_base::binary); double nums[4] = 1.1, 2.2, 3.3, 4.4 ; fout.write((char *) nums, sizeof(nums)); 배열의크기 (32바이트) 만큼 fout.close(); 쓰기 ifstream fin("a.txt", ios_base::in ios_base::binary); double nums2[4]; fin.read((char *) nums2, sizeof(nums2)); for (int i = 0; i < 4; i++) cout << nums2[i] << '\t'; cout << endl; 13 /18 cout << " 총바이트수 : " << fin.gcount() << endl; 마지막으로읽은데이터의바이트수
16 강. 파일입출력이진파일입출력 14 /18 구조체변수의이진파일입출력예 Point Po; struct Point int x, y; ; ofstream fout("a.txt",ios_base::out ios_base::binary); for (int i = 0; i < 5; i++) Po.x = Po.y = i; fout.write((char *) &Po, sizeof(point)); fout.close(); Po 데이터 (8바이트) 를파일로저장 ifstream fin("a.txt", ios_base::in ios_base::binary); while (fin.read((char *) &Po, sizeof(point))) cout << "(" << Po.x << ", " << Po.y << ")" << endl; 하나씩다시읽어오기 : 더이상읽을데이터 fin.close(); 없을경우 while문을빠져나오게됨
16 강. 파일입출력임의접근 스트림포인터 입력포인터 (get pointer ) : 다음입력위치를가리킴 출력포인터 (put pointer) : 다음출력위치를가리킴 입력과출력이진행되면자동으로입출력된바이트수만큼다음위치로이동함 입력포인터와출력포인터의위치를이동하는방 법 fin.seekg( 위치 _ 바이트단위 ); 방향기준 fin.seekg( 위치 _ 바이트단위, 방향기준 ); ios_base::beg : 파일시작위치 ios_base::cur : 현재위치 fout.seekp( 위치 _ 바이트단위 ); ios_base::end : 마지막 ( 다음 ) 위치 fout.seekp( 위치 _ 바이트단위, 방향기준 ); 15 /18
16 강. 파일입출력임의접근 입력포인터와출력포인터의현재위치를확인하는함수 fin.tellg() fout.tellp() seekg 와 tellg 함수의적용예 16 /18
16 강. 파일입출력임의접근 임의접근의활용 데이터의크기가일정한이진파일에대한활용도가높음 ofstream fout("a.txt", ios_base::out ios_base::binary); for (int i = 1; i <= 10; i++) fout.write((char *) &i, sizeof(int)); 1~10 데이터쓰기 int Num = 100; 5번째데이터로이동 fout.seekp((5-1) * sizeof(int), ios_base::beg); fout.write((char *) &Num, sizeof(int)); fout.close(); 값 100 쓰기 17 /18 ifstream fin("a.txt", ios_base::in ios_base::binary); for (int i = 0; i < 10; i++) fin.read((char *) &Num, sizeof(int)); cout << Num << endl; 값들을읽고확인 fin.close();
16 강. 파일입출력임의접근 구조체데이터에대한임의접근예 Point Po = 1, 1 ; fstream fio("a.txt", ios_base::in ios_base::out ios_base::trunc ios_base::binary); (1, 1) 5개저장 for (int i = 0; i < 5; i++) fio.write((char *) &Po, sizeof(point)); 출력포인터를세번째 데이터로이동 fio.seekp((3-1) * sizeof(point), ios_base::beg); Po.x = 2; Po.y = 2; (2, 2) 로변경 fio.write((char *) &Po, sizeof(point)); 입력포인터를시작위치로이동 fio.seekg(0, ios_base::beg); while (fio.read((char *) &Po, sizeof(point))) 저장된데이터확인 cout << "(" << Po.x << ", " << Po.y << ")" << endl; 18 /18 fio.close();