제13장 파일처리 스트림의 개념을 이해한다. 객체 지향적인 방법을 사용하여 파일 입출력을 할 수 있다.

Slides:



Advertisements
Similar presentations
ㅎㅎ 구조체 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스 구조체 배열.
Advertisements

ㅎㅎ 구조체 C++ 프로그래밍 기초 : 객체지향의 시작 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스
명품 C++ 12장 C++ 파일 입출력.
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express Slide 1 (of 27)
Power C++ 제6장 포인터와 문자열.
C++ Espresso 제1장 기초 사항.
쉽게 풀어쓴 C언어 Express 제16장 파일 입출력 C Express.
10장 예외 Lab 10-1.
제6장 객체배열과 벡터 객체 배열을 이해한다. 벡터(vector) 클래스를 사용할 수 있다.
8. 객체와 클래스 (기본).
11장 구조체와 열거형 구조체의 정의 구조체 변수의 선언 구조체 초기화 및 사용 구조체 재정의 포인터를 이용해서 구조체 사용
제12장 다형성과 가상함수 다형성의 개념을 이해한다. 상향 형변환의 개념을 이해한다. 가상 함수의 개념을 이해한다.
데이터 파일 C 데이터 파일과 스트림(Stream) 텍스트 파일 처리
Lesson 3. 입출력과 제어문.
조 병 규 Software Quality Lab. 한국교통대학교
제 6장. 생성자와 소멸자 학기 프로그래밍언어및실습 (C++).
제 3장. C보다 나은 C++ II.
1. C++ 시작하기.
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
DSP Lab. Week 3 My image Doug Young Suh Media Lab. Rm401
SqlParameter 클래스 선문 비트 18기 발표자 : 박성한.
컴퓨터 프로그래밍 기초 #02 : printf(), scanf()
정적 멤버 변수/정적 멤버 함수 - friend 함수/클래스 template
C++ Espresso 제12장 템플릿.
제4장 클래스와 객체 객체 지향 기법을 이해한다. 클래스를 작성할 수 있다. 클래스에서 객체를 생성할 수 있다.
임베디드 실습 # LED, 7’Segment 제어
DK-128 실습 EEPROM 제어 아이티즌 기술연구소
11 표준 입출력과 파일 입출력 데이터를 읽고 쓰는 다양한 방법 익히기!.
파일 입출력 12.
17장. 문자열 01_ 문자열 사용의 기본 02_ 문자열의 사용.
14. 예외처리.
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
13. 연산자 오버로딩.
제14장 예외처리와 템플릿 예외 처리의 개요를 학습한다. 예외 처리를 적용할 수 있다. 템플릿의 개념을 이해한다.
어서와 C언어는 처음이지 제14장.
제5장 생성자와 접근제어 객체 지향 기법을 이해한다. 클래스를 작성할 수 있다. 클래스에서 객체를 생성할 수 있다.
3장 상수 변수 기본 자료형 키워드와 식별자 상수와 변수 기본 자료형 형변환 자료형의 재정의.
24장. 파일 입출력.
제2장 제어구조와 배열 if-else 문에 대하여 학습한다. 중첩 if-else 문에 대하여 학습한다.
제 1장. C++ 시작하기.
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
01_ C++ 스타일의 입출력 02_ C 스타일의 입출력
4. 고급변수 사용 : 포인터와 관련하여 메모리 바라보기
10. 문자열클래스와파일클래스.
DK-128 실습 내부 EEPROM 제어 아이티즌 기술연구소 김태성 연구원
컴퓨터 프로그래밍 기초 - 10th : 포인터 및 구조체 -
제 4장. 객체 지향 프로그래밍 시작하기 학기 프로그래밍언어및실습 (C++).
컴퓨터 프로그래밍 기초 - 8th : 함수와 변수 / 배열 -
C++ Espresso 제11장 예외 처리와 형변환.
제8장 포인터와 동적객체 생성 포인터의 개념을 이해한다. 포인터와 관련된 연산을 이해한다.
컴퓨터 계측 및 실습 디지털 출력 영남대학교 기계공학부.
CHAP 21. 전화, SMS, 주소록.
제 11장. 템플릿과 STL 학기 프로그래밍언어및실습 (C++).
데이터 동적 할당 Collection class.
03. 메모리 관리 C++ 프로그램에서 다룰 수 있는 메모리의 종류
C++ Espresso 제13장 입출력과 파일처리.
소리 편집 안 재 형.
포인터와 배열 조 병 규 한 국 교 통 대 학 교 SQ Lab..
중복 멤버의 처리 조 병 규 한 국 교 통 대 학 교 SQ Lab..
제 8장. 클래스의 활용 학기 프로그래밍언어및실습 (C++).
구조체(struct)와 공용체(union)
Chapter 12 파일 입출력.
Static과 const 선언 조 병 규 한 국 교 통 대 학 교 SQ Lab..
실습과제 (변수와 자료형, ) 1. 다음 작업 (가), (나), (다)를 수행하는 프로그램 작성
17장. 문자열 01_ 문자열 사용의 기본 02_ 문자열의 사용.
제 29 강 스트링(string) 다루기 s a i s . s T i h t g r i n.
29장. 템플릿과 STL 01_ 템플릿 02_ STL.
File IO 정보물리.
개정판 누구나 즐기는 C언어 콘서트 제13장 동적 메모리 출처: pixabay.
개정판 누구나 즐기는 C언어 콘서트 제12장 파일 입출력 출처: pixabay.
Presentation transcript:

제13장 파일처리 스트림의 개념을 이해한다. 객체 지향적인 방법을 사용하여 파일 입출력을 할 수 있다. 텍스트 파일과 이진 파일의 차이점을 이해한다. 순차 파일과 임의 접근 파일의 차이점을 이해한다.

이번 장에서 만들어 볼 프로그램

스트림(stream) 스트림(stream)은 “순서가 있는 데이터의 연속적인 흐름” 이다. 스트림은 입출력을 물의 흐름처럼 간주하는 것이다.

입출력 관련 클래스들

파일쓰기 int main() { ofstream os{ "numbers.txt" }; if (!os) { cerr << "파일 오픈에 실패하였습니다" << endl; exit(1); } for(int i=0;i<100; i++) os << i <<" "; return 0; // 객체 os가 범위를 벗어나면 ofstream 소멸자가 파일을 닫는다.

파일읽기 int main() { ifstream is{ "numbers.txt" }; if (!is) { cerr << "파일 오픈에 실패하였습니다" << endl; exit(1); } int number; while (is) { is >> number; cout << number << " "; cout << endl; return 0; // 객체 is가 범위를 벗어나면 ifstream 소멸자가 파일을 닫는다.

파일모드

예제 int main() { using namespace std; ofstream os("sample.txt", ios::app); if (!os) cerr << "파일 오픈에 실패하였습니다" << endl; exit(1); } os << "추가되는 줄 #1" << endl; os << "추가되는 줄 #2" << endl; return 0;

Lab: 온도데이터를 처리해보자 #1

예제 #include <iostream> #include <fstream>// 파일 입출력을 하려면 헤더 파일을 포함하여야 한다. using namespace std; int main() { ifstream is{ "temp.txt" }; if (!is) { // ! 연산자 오버로딩 cerr << "파일 오픈에 실패하였습니다" << endl; exit(1); } int hour; double temperature; while (is >> hour >> temperature) { cout << hour << "시: 온도 "<< temperature << endl; return 0;

Lab: 온도데이터를 처리해보자 #2 파일에서 읽은 데이터를 객체로 벡터에 저장했다가 다시 꺼내서 화면에 출력해보자.

Solution class TempData { public: int hour; double temperature; }; int main() { ifstream is{ "temp.txt" }; if (!is) { // ! 연산자 오버로딩 cerr << "파일 오픈에 실패하였습니다" << endl; exit(1); } vector<TempData> temps;

Solution int hour; double temperature; while (is >> hour >> temperature) { temps.push_back(TempData{ hour, temperature }); } for ( TempData t : temps) { cout << t.hour << "시: 온도 " << t.temperature << endl; return 0;

멤버함수를 이용한 파일 입출력 get(), put() #include <iostream> #include <fstream> using namespace std; int main() { ifstream is{ "scores.txt" }; if (!is) { // ! 연산자 오버로딩 cerr << "파일 오픈에 실패하였습니다" << endl; exit(1); }

멤버함수를 이용한 파일 입출력 get(), put() char c; is.get(c); // 하나의 문자를 읽는다. while (!is.eof()) // 파일의 끝이 아니면 { cout << c; is.get(c); } cout << endl; return 0;

예제 #include <string> #include <iostream> using namespace std; int main() { string address; cout << "주소를 입력하시오: "; getline(cin, address); cout << "안녕! " << address << "에 사시는 분" << endl; return 0; }

출력 형식 지정

Lab: 줄번호를 붙여보자. 소스가 저장된 텍스트 파일을 읽어서 각 줄의 앞에 숫자 를 붙인 후에 출력 파일에 기록하여 보자.

Solution int main() { ifstream is("scores.txt");; ofstream os("result.txt"); ; if (is.fail()) { cerr << "파일 오픈 실패" << endl; exit(1); } if (os.fail()) {

Solution char c; int line_number = 1; is.get(c); os << line_number << ": "; while (!is.eof()) { os << c; if (c == '\n') { line_number++; } return 0;

텍스트와 이진 파일

텍스트와 이진 파일의 저장 방법 비교

이진 파일 입출력 ofstream os{ "test.dat", ofstream::binary }; int x=5; os.write((char*)&x, sizeof(int)); // 정수 변수는 4바이트로 이루어져 있다.

예제 int main() { int buffer[] = { 10, 20, 30, 40, 50 }; ofstream os{ "test.dat",ofstream::binary }; if (!os) cout << "test.txt 파일을 열 수 없습니다." << endl; exit(1); } os.write((char *)&buffer, sizeof(buffer)); return 0;

예제 int main() { int buffer[5]; ifstream is{ "test.dat", ifstream::binary }; if (!is) cout << "test.txt 파일을 열 수 없습니다." << endl; exit(1); } is.read((char *)&buffer, sizeof(buffer)); for(auto& e: buffer) cout << e << " "; return 0;

Lab: 이진 파일 복사 프로그램 하나의 이미지 파일을 다른 이미지 파일로 복사하는 프로 그램을 작성하여 보자.

Solution #include <iostream> #include <fstream> #include <string> using namespace std; int main() { string ifile, ofile; cout << "원본 파일 이름:"; cin >> ifile; cout << "복사 파일 이름:"; cin >> ofile; ifstream source(ifile, ios::binary); ofstream dest(ofile, ios::binary);

Solution #if 1 dest << source.rdbuf(); #else if (source.is_open() && dest.is_open()) { while (!source.eof()) { dest.put(source.get()); } #endif return 0;

임의 접근 파일 순차 접근(sequential access) 방법: 데이터를 파일의 처 음부터 순차적으로 읽거나 기록하는 방법 임의 접근(random access) 방법: 파일의 어느 위치에서 든지 읽기와 쓰기가 가능한 방법

임의 접근 파일의 원리 파일 위치 표시자: 읽기와 쓰기 동작이 현재 어떤 위치에서 이 루어지는 지를 나타낸다. 강제적으로 파일 위치 표시자를 이동시키면 임의 접근이 가능 파일 위치 표시자

임의 접근 관련 함수 seekg(long offset, seekdir way); is.seekg(ios::beg, 100);   is.seekg(ios::end, 0); is.seekg(ios::cur, -100);

예제 예제에서는 10개의 난수를 저장한 이진 파일을 만들고 파 일의 크기를 알아낸 다음에 파일의 중간으로 파일 위치 표시자를 이동시켜서 그 위치에 있는 난수를 읽어오는 프 로그램을 작성하여 보자.

Solution const int SIZE = 10; int main() { int data; // 이진 파일을 쓰기 모드로 연다. ofstream os{ "test.dat", ofstream::binary }; if (os.fail()) { cout << "test.dat 파일을 열 수 없습니다." << endl; exit(1); } for (int i = 0; i < SIZE; i++) { data = rand(); cout << data << " "; os.write((char *)&data, sizeof(data)); os.close();

Solution // 이진 파일을 읽기 모드로 연다. ifstream is{ "test.dat", ofstream::binary }; if (is.fail()) { cout << "test.dat 파일을 열 수 없습니다." << endl; exit(1); } // 파일 크기를 알아낸다. is.seekg(0, ios::end); long size = is.tellg(); cout << endl << "파일 크기는 " << size << endl; // 파일의 중앙으로 위치 표시자를 이동시킨다. is.seekg(size/2, ios::beg); is.read((char *)&data, sizeof(int)); cout << "중앙위치의 값은 " << data << endl; return 0;

Lab: 행맨 업그레이드

Solution #include <conio.h> #include <iostream> #include <string> #include <fstream> #include <vector> using namespace std; int main() { vector<string> words; ifstream infile("d:/words.txt"); while (infile) { string word; infile >> word; words.push_back(word); }

Solution while (true) { string r = words[rand() % words.size()]; cout << "이번에 선택된 단어는 " << r << endl; getch(); } return 0;

Lab: 이미지 파일을 읽어서 표시해보자.

Solution #include <windows.h> #include <iostream> #include <fstream> using namespace std; int main() { HDC hdc = GetWindowDC(GetForegroundWindow()); // 이진 파일을 쓰기 모드로 연다. ifstream is{ "d:\\lena(256x256).raw", ifstream::binary }; if (is.fail()) cout << "d:\\lena(256x256).raw 파일을 열 수 없습니다." << endl; exit(1); } int size = 256 * 256; char * memblock = new char[size]; is.read(memblock, size); is.close();

Solution int r, c; for (r = 0; r < 256; r++) { for (c = 0; c < 256; c++) { int red, green, blue; red = green = blue = memblock[r * 256 + c]; SetPixel(hdc, c, r, RGB(red, green, blue)); } delete memblock; return 0;

Q & A