파일 입출력 12.

Slides:



Advertisements
Similar presentations
6 장. printf 와 scanf 함수에 대한 고찰 printf 함수 이야기 printf 는 문자열을 출력하는 함수이다. – 예제 printf1.c 참조 printf 는 특수 문자 출력이 가능하다. 특수 문자의 미 \a 경고음 소리 발생 \b 백스페이스 (backspace)
Advertisements

Format String Attack! 포맷 스트링 공격 경일대학교 사이버보안학과 학년 남주호.
Part 03 상수, 변수, 자료형 ©우균, 창병모 © 우균, 창병모.
네트워크 프로그래밍 및 실습.
명품 JAVA Programming.
ㅎㅎ 구조체 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스 구조체 배열.
ㅎㅎ 구조체 C++ 프로그래밍 기초 : 객체지향의 시작 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스
명품 C++ 12장 C++ 파일 입출력.
ㅎㅎ C++ 프로그래밍의 첫 걸음 C++로 프로그래밍한다는 것의 의미 세상에서 가장 간단한 C++ 프로그램
ㅎㅎ C++ 프로그래밍의 첫 걸음 C++ 프로그래밍 기초 : 객체지향의 시작 C++로 프로그래밍한다는 것의 의미
2장. 프로그램의 기본 구성. 2장. 프로그램의 기본 구성 2-1"Hello, World!" 들여다 보기 /* Hello.c */ #include int main(void) { printf("Hello, World! \n"); return 0;
Image & Video processing
제 9 장 구조체와 공용체.
데이터 파일 C 데이터 파일과 스트림(Stream) 텍스트 파일 처리
조 병 규 Software Quality Lab. 한국교통대학교
제 6장. 생성자와 소멸자 학기 프로그래밍언어및실습 (C++).
명품 JAVA Essential.
제13장 파일처리 스트림의 개념을 이해한다. 객체 지향적인 방법을 사용하여 파일 입출력을 할 수 있다.
5장. 참조 타입.
1. C++ 시작하기.
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
SqlParameter 클래스 선문 비트 18기 발표자 : 박성한.
컴퓨터 프로그래밍 기초 #02 : printf(), scanf()
C++ Espresso 제12장 템플릿.
파일 기술자 파일 기술자 현재 열려있는 파일을 구분하는 정수값 저수준 파일 입출력에서 열린 파일을 참조하는데 사용
DK-128 실습 EEPROM 제어 아이티즌 기술연구소
11 표준 입출력과 파일 입출력 데이터를 읽고 쓰는 다양한 방법 익히기!.
6장. printf와 scanf 함수에 대한 고찰
명품 JAVA Essential.
프로그래밍 랩 – 7주 리스트.
14. 예외처리.
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
11장. 1차원 배열.
명품 C++ 프로그래밍 2장. C++ 프로그래밍의 기본.
C#.
13. 연산자 오버로딩.
JA A V W. 03.
사용자 함수 사용하기 함수 함수 정의 프로그램에서 특정한 기능을 수행하도록 만든 하나의 단위 작업
어서와 C언어는 처음이지 제14장.
이름 : 황 상 두 전화번호 : 이메일 : PinTool 이름 : 황 상 두 전화번호 : 이메일 :
3장 상수 변수 기본 자료형 키워드와 식별자 상수와 변수 기본 자료형 형변환 자료형의 재정의.
Java의 정석 제 5 장 배 열 Java 정석 남궁성 강의 의
유승석 FILE I/O File Input/Output 유승석 SD50 – C# & .NET Platform.
영상처리 실습 인공지능연구실.
명품 C++ 프로그래밍 2장. C++ 프로그래밍의 기본.
24장. 파일 입출력.
Lesson 2. 기본 데이터형.
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
연산자 (Operator).
01_ C++ 스타일의 입출력 02_ C 스타일의 입출력
10. 문자열클래스와파일클래스.
DK-128 실습 내부 EEPROM 제어 아이티즌 기술연구소 김태성 연구원
컴퓨터 프로그래밍 기초 - 10th : 포인터 및 구조체 -
2장. 변수와 타입.
자바 5.0 프로그래밍.
컴퓨터 프로그래밍 기초 - 8th : 함수와 변수 / 배열 -
Files and Exceptions Byoungjun Kim
Canary value 스택 가드(Stack Guard).
C++ Espresso 제13장 입출력과 파일처리.
제 8장. 클래스의 활용 학기 프로그래밍언어및실습 (C++).
TVM ver 최종보고서
구조체(struct)와 공용체(union)
Chapter 12 파일 입출력.
실습과제 (변수와 자료형, ) 1. 다음 작업 (가), (나), (다)를 수행하는 프로그램 작성
제 4 장 Record.
17장. 문자열 01_ 문자열 사용의 기본 02_ 문자열의 사용.
06. 디바이스의 등록과 해제 김진홍
29장. 템플릿과 STL 01_ 템플릿 02_ STL.
Prof. Kyungshik Lim Kyungpook National University
2019 2학기 9장 배열과 포인터 1. 주소, 주소연산자(&) 2. 포인터, 역참조연산자(*) 3. 배열과 포인터.
Presentation transcript:

파일 입출력 12

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

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

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

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

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

예제 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 학번>>20131111 학과>>computer 20131111이 ‘2', ‘0‘', ‘1‘, ‘3’, ‘1’, ‘1’, ‘1’, ‘1’의 문자들로 변환되어 저장 kitae 20131111 computer

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

파일의 경로명이 틀리거나 존재하지 않는 파일을 열려고 하면 열기가 실패한다. 예제 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 20131111 computer

파일 모드(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로 지정된다.

파일 모드 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:0104447777"; // 기존의 student.txt 끝에 "tel:0104447777"을 추가하여 저장 바이너리 I/O로 data.bin 파일을 기록하는 경우 fstream fbinout; fbinout.open("data.bin", ios::out | ios::binary); char buf[128]; .... fbinout.write(buf, 128); // buf에 있는 128 바이트를 파일에 기록

멤버함수를 이용한 텍스트 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() 최근에 파일에서 읽은 바이트 수 리턴

예제 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으로 카운트 된다.

예제 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]

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

바이너리 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 개의 바이트 저장

예제 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)

예제 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()로 한번에 배열을 쓴다. 0 1 2 3 4 5 6 7 8 9 3.15 int 타입의 정수는 4 바이트로 구성되므로 최하위 바이트부터 4 바이트를 기록한다. 그러므로 09 00 00 00의 4 바이트는 거꾸로 조합하면 00000009의 값이다. 9 3.15 c:\\data.dat 파일 내부

윈도우의 ‘사진 샘플’ 폴더에 있는 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

12 장 프로그래밍 실습

12 장 프로그래밍 실습

12 장 프로그래밍 실습