Presentation is loading. Please wait.

Presentation is loading. Please wait.

파일 입출력 12.

Similar presentations


Presentation on theme: "파일 입출력 12."— Presentation transcript:

1 파일 입출력 12

2 텍스트 파일과 이진 파일 텍스트 파일 (Text File) 문자로만 구성된 파일 각 문자마다 문자 코드 (이진수) 할당 종류
알파벳, 한글, 숫자, 기호 문자 (% < ? 등) '\n', '\t' 등의 특수 문자도 포함 각 문자마다 문자 코드 (이진수) 할당 ASCII 코드, 유니코드 종류 txt 파일, HTML 파일, XML 파일, C++ 소스 파일, C 소스 파일, 자바 소스 파일 등 ASCII 코드 표 샘플

3 텍스트 파일과 이진 파일 텍스트 파일의 내부 <Enter> 키 ‘\r’ ‘\n’
파일 내의 주소 파일 내부의 바이너리 데이타 (16진수로 표현됨) 문자로 표현 elvis.txt를 Edit Plus로 열어 놓은 화면

4 텍스트 파일과 이진 파일 이진 파일 (Binary File) 문자 및 문자 이외의 2진 데이터로 구성된 파일 종류
jpeg, bmp 등의 이미지 파일, mp3 등의 오디오 파 일 hwp, doc, ppt 등의 문서 파일 obj, exe 등 컴파일된 코드나 실행 파일 36 텍스트파일 51 ‘3’ 54 ‘6’ 36 ‘$’ 이진파일 uisee.jpg 문자로 매핑되지 않는 바이너리 값 파일 내의 주소 파일 내부의 바이너리 데이타 (16진수로 표현됨) uisee.jpg를 Edit Plus로 열어 놓은 화면

5 하나의 파일에 대해 읽기와 쓰기를 동시에 할 때 사용
파일 입출력 표준 파일 입출력 클래스 (상속도) ios istream ostream #include <fstream> using namespace std; iostream 파일 쓰기 시에 사용 파일 읽기 시에 사용 ifstream ofstream 하나의 파일에 대해 읽기와 쓰기를 동시에 할 때 사용 fstream

6 텍스트 파일 입출력 텍스트 파일 쓰기 절차 스트림 객체 생성: ofstream 파일 열기 파일 열기 성공 검사
파일 쓰기 : << 연산자 파일 닫기 ofstream fout; fout.open(“Song.txt”) if(!fout) { fout << age << endl; fout << singer << endl; fout << song << endl; } fout.close(); << : ofstream 클래스의 연산자 중복

7 예제 12–1 키보드로 입력 받아 텍스트 파일 저장하기
#include <iostream> #include <fstream> using namespace std; int main() { char name[10], dept[20]; int sid; // 키보드로부터 읽기 cout << "이름>>"; cin >> name; // 키보드에서 이름 입력 받음 cout << "학번>>"; cin >> sid; // 키보드에서 학번 입력 받음 cout << "학과>>"; cin >> dept; // 키보드에서 학과 입력 받음 // 파일 열기. student.txt 파일을 열고, 출력 스트림 생성 ofstream fout("c:\\student.txt"); if(!fout) { // 열기 실패 검사 cout << "student.txt 파일을 열 수 없다"; return 0; } // 파일 쓰기 fout << name << endl; // name 쓰기 fout << sid << endl; // sid 쓰기 fout << dept << endl; // dept 쓰기 fout.close(); // 파일 닫기 정수 sid가 문자열로 변환되어 저장됨 이름>>kitae 학번>> 학과>>computer ‘2', ‘0‘', ‘1‘, ‘3’, ‘1’, ‘1’, ‘1’, ‘1’의 문자들로 변환되어 저장 kitae computer

8 텍스트 파일 입출력 텍스트 파일 읽기 절차 스트림 객체 생성: ifstream 파일 열기 파일 열기 성공 검사
파일 쓰기 : >> 연산자 파일 닫기 ifstream fin; fin.open(“Song.txt”) if(!fin) { fin << age << endl; fin << singer << endl; fin << song << endl; } fout.close(); << : ifstream 클래스의 연산자 중복

9 파일의 경로명이 틀리거나 존재하지 않는 파일을 열려고 하면 열기가 실패한다.
예제 12–2 ifstream과 >> 연산자로 텍스트 파일 읽기 #include <iostream> #include <fstream> using namespace std; int main() { // 스트림 객체 생성 및 파일 열기 ifstream fin; fin.open("c:\\student.txt"); if(!fin) { // 파일 열기 실패 확인 cout << "파일을 열 수 없다"; return 0; } char name[10], dept[20]; int sid; // 파일 읽기 fin >> name; // 파일에 있는 문자열을 읽어서 name 배열에 저장 fin >> sid; // 정수를 읽어서 sid 정수형 변수에 저장 fin >> dept; // 문자열을 읽고 dept 배열에 저장 // 읽은 텍스트를 화면에 출력 cout << name << endl; cout << sid << endl; cout << dept << endl; fin.close(); // 파일 읽기를 마치고 파일을 닫는다. 파일의 경로명이 틀리거나 존재하지 않는 파일을 열려고 하면 열기가 실패한다. kitae computer

10 파일 모드(file mode) 파일 모드 파일 입출력에 대한 구체적인 작업 행태에 대한 지정 읽기/쓰기 텍스트 / 이진
void open(const char * filename, int mode) 파일 모드 의미 ios::in 읽기 위해 파일을 연다 (ifstream 의 default) ios::out 쓰기 위해 파일을 연다 (ofstream 의 default) ios::ate (at end) 파일을 쓰기 위해 연다. 그리고 열기 후 파일 포인트를 파일 끝에 둔다. 파일 포인터를 옮겨 파일 내의 임의의 위치에 쓸 수 있다. ios::app 파일 쓰기 시에만 적용된다. 파일 쓰기 시마다, 자동으로 파일 포인트가 파일 끝으로 옮겨져서 항상 파일의 끝에 쓰기가 이루어진다. ios::trunc 파일을 열 때, 파일이 존재하면 파일의 내용을 모두 지워 파일 크기가 0인 상태로 만든다. ios::out 모드를 지정하면 디폴트로 함께 지정된다. ios::binary 바이너리 I/O로 파일을 연다. 이 파일 모드가 지정되지 않으면 텍스트 I/O로 지정된다.

11 파일 모드 student.txt 파일에서 처음부터 읽고자 하는 경우 student.txt 파일의 끝에 데이터를 저장하는 경우
ifstream fin; fin.open("student.txt"); ifstream fin; fin.open("student.txt", ios::in); student.txt 파일의 끝에 데이터를 저장하는 경우 ofstream fout; fout.open("student.txt", ios::out | ios::app); fout << "tel: "; // 기존의 student.txt 끝에 "tel: "을 추가하여 저장 바이너리 I/O로 data.bin 파일을 기록하는 경우 fstream fbinout; fbinout.open("data.bin", ios::out | ios::binary); char buf[128]; .... fbinout.write(buf, 128); // buf에 있는 128 바이트를 파일에 기록

12 멤버함수를 이용한 텍스트 I/O ifstream / ofstream 클래스의 멤버함수 들 멤버 함수 설명
int get(void); 문자 1개 입력 ostream& put(char) 문자 1개 입력, 연속 호출 가능 istream& getline(char *, int, char = ‘\n’) 지정한 개수 또는 줄 단위 문자열 입력, ‘\n’ 제거 istream& read(char* s, int n) 파일에서 최대 n 바이트를 배열 s 에 읽어드림. 파일의 끝을 만나면 읽기 중단 ostream& write(char*s, int n) 배열 s 에 있는 처음 n 바이트를 파일에 저장 int gcount() 최근에 파일에서 읽은 바이트 수 리턴

13 예제 12–3 get()을 이용한 텍스트 파일 읽기 #include <iostream>
#include <fstream> using namespace std; int main() { char* file = "c:\\windows\\system.ini"; ifstream fin(file); // ifstream fin; fin.open(file); if(!fin) { cout << file << " 열기 오류" << endl; return 0; } int count = 0; int c; while((c=fin.get()) != EOF) { // EOF를 만날 때까지 문자 읽기 cout << (char)c; count++; cout << "읽은 바이트 수는 " << count << endl; fin.close(); // 파일 닫기 ; for 16-bit app support [386Enh] woafont=dosapp.fon EGA80WOA.FON=EGA80WOA.FON EGA40WOA.FON=EGA40WOA.FON CGA80WOA.FON=CGA80WOA.FON CGA40WOA.FON=CGA40WOA.FON [drivers] wave=mmdrv.dll timer=timer.drv [mci] 읽은 바이트 수는 206 파일에서 문자 읽기 while(true) { int c = fin.get(); if(c == EOF) break; cout << (char)c; count++; } 텍스트 I/O 모드로 읽을 때, get() 은 라인의 끝에 있는 ‘\r\n’의 두 바이트를 ‘\n’의 한 바이트로 리턴한다. c:\windows\system.ini는 총 13 라인의 219 바이트이지만, 실제 읽은 바이트 수는 각 라인의 ‘\r’ 개수 만큼 13개 모자란 206으로 카운트 된다.

14 예제 12-5 istream의 getline()을 이용하여 텍스트 파일을 읽고 화면 출력
#include <iostream> #include <fstream> using namespace std; int main() { ifstream fin("c:\\windows\\system.ini"); if(!fin) { cout << "c:\\windows\\system.ini 열기 실패" << endl; return 0; } char buf[81]; // 한 라인이 최대 80개의 문자로 구성된다고 가정 while(true) { fin.getline(buf, 81); // 한 라인이 최대 80개의 문자로 구성 if(fin.eof()) break; // 읽기 종료 cout << buf << endl; // 라인 출력 fin.close(); ; for 16-bit app support [386Enh] woafont=dosapp.fon EGA80WOA.FON=EGA80WOA.FON EGA40WOA.FON=EGA40WOA.FON CGA80WOA.FON=CGA80WOA.FON CGA40WOA.FON=CGA40WOA.FON [drivers] wave=mmdrv.dll timer=timer.drv [mci]

15 바이너리 I/O 바이너리 I/O 방식 바이너리 I/O 모드 읽기 / 쓰기 데이터의 2진수 값을 그대로 파일에 쓰고 읽는 방식
ios::binary 디폴트는 텍스트 I/O 읽기 / 쓰기 put, get, read, write 함수 사용 >>, <<, getline 은 텍스트 I/O 에서 사용

16 바이너리 I/O 텍스트 I/O 모드 char buf[] = {'a', 'b', '\n'}; fout.write(buf, 3);
// 파일에 ‘a’, ‘b’, ‘\r’, ‘\n’의 4 개의 바이트 저장 바이너리 I/O 모드 ofstream fout("c:\\student3.txt", ios::out | ios::binary); char buf[] = {'a', 'b', '\n'}; fout.write(buf, 3); // 파일에 ‘a’, ‘b’, ‘\n’의 3 개의 바이트 저장

17 예제 12–8 read()로 텍스트 파일을 바이너리 I/O로 읽기
#include <iostream> #include <fstream> using namespace std; int main() { char* file = "c:\\windows\\system.ini"; ifstream fin; fin.open(file, ios::in | ios::binary); // 읽기 모드로 파일 열기 if(!fin) { // 열기 실패 검사 cout << "파일 열기 오류"; return 0; } int count = 0; char s[32]; while(!fin.eof()) { // 파일 끝까지 읽는다. fin.read(s, 32); // 최대 32 바이트를 읽어 배열 s에 저장 int n = fin.gcount(); // 실제 읽은 바이트 수 알아냄 cout.write(s, n); // 버퍼에 있는 n 개의 바이트를 화면에 출력 count += n; cout << "읽은 바이트 수는 " << count << endl; fin.close(); // 입력 파일 닫기 ; for 16-bit app support [386Enh] woafont=dosapp.fon EGA80WOA.FON=EGA80WOA.FON EGA40WOA.FON=EGA40WOA.FON CGA80WOA.FON=CGA80WOA.FON CGA40WOA.FON=CGA40WOA.FON [drivers] wave=mmdrv.dll timer=timer.drv [mci] 읽은 바이트 수는 219 파일의 크기는 219 바이트임 \r\n 을 2 바이트로 카운트 (비교: 예제 12-3)

18 예제 12-10 int 배열과 double 값을 바이너리 파일에 저장하고 읽기
#include <iostream> #include <fstream> using namespace std; int main() { char* file = "c:\\data.dat"; ofstream fout; fout.open(file, ios::out | ios::binary); // 읽기 모드로 파일 열기 if(!fout) { // 열기 실패 검사 cout << "파일 열기 오류"; return 0; } int n[] = {0,1,2,3,4,5,6,7,8,9}; double d = 3.15; fout.write((char*)n, sizeof(n)); // int 배열 n을 한번에 파일에 쓴다. fout.write((char*)(&d), sizeof(d)); // double 값 하나를 파일에 쓴다. fout.close(); // 배열 n과 d 값을 임의의 값으로 변경시킨다. for(int i=0; i<10; i++) n[i]=99; d = 3.15; // 배열 n과 d 값을 파일에서 읽어 온다. ifstream fin(file, ios::in | ios::binary); if(!fin) { // 열기 실패 검사 cout << "파일 열기 오류"; return 0; } fin.read((char*)n, sizeof(n)); fin.read((char*)(&d), sizeof(d)); for(int i=0; i<10; i++) cout << n[i] << ' '; cout << endl << d << endl; fin.close(); read()로 한번에 배열을 읽는다. 바이너리 I/O 모드 설정 write()로 한번에 배열을 쓴다. 3.15 int 타입의 정수는 4 바이트로 구성되므로 최하위 바이트부터 4 바이트를 기록한다. 그러므로 의 4 바이트는 거꾸로 조합하면 의 값이다. 9 3.15 c:\\data.dat 파일 내부

19 윈도우의 ‘사진 샘플’ 폴더에 있는 tulips.jpg의 경로명
예제 12-9 read()/write()로 이미지 파일 복사 #include <iostream> #include <fstream> using namespace std; int main() { // 소스 파일과 목적 파일의 이름 char* srcFile = "c:\\users\\public\\pictures\\sample pictures\\tulips.jpg"; char* destFile = "c:\\copytulips.jpg"; // 소스 파일 열기 ifstream fsrc(srcFile, ios::in | ios::binary); if(!fsrc) { // 열기 실패 검사 cout << srcFile << " 열기 오류" << endl; return 0; } // 목적 파일 열기 ofstream fdest(destFile, ios::out | ios::binary); if(!fdest) { // 열기 실패 검사 cout << destFile << " 열기 오류" << endl; // 소스 파일에서 목적 파일로 복사하기 char buf[1024]; while(!fsrc.eof()) { // 파일 끝까지 읽는다. fsrc.read(buf, 1024); // 최대 1024 바이트를 읽어 배열 s에 저장 int n = fsrc.gcount(); // 실제 읽은 바이트 수 알아냄 fdest.write(buf, n); // 읽은 바이트 수 만큼 버퍼에서 목적 파일에 기록 cout << srcFile << "을 " << destFile << "로 복사 완료" << endl; fsrc.close(); fdest.close(); 윈도우의 ‘사진 샘플’ 폴더에 있는 tulips.jpg의 경로명 c:\copytulips.jpg로 복사 윈도우의 ‘사진 샘플’ 폴더에 있는 tulips.jpg 복사한 c:\copytulips.jpg

20 12 장 프로그래밍 실습

21 12 장 프로그래밍 실습

22 12 장 프로그래밍 실습


Download ppt "파일 입출력 12."

Similar presentations


Ads by Google