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

쉽게 풀어쓴 C 프로그래밍 - Sangji Universitycompiler.sangji.ac.kr/lecture/windows/2018/lecture13.pdf · 2019. 2. 14. · 제13장파일처리 1. 스트림의개념을이해한다

  • Upload
    others

  • View
    4

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 쉽게 풀어쓴 C 프로그래밍 - Sangji Universitycompiler.sangji.ac.kr/lecture/windows/2018/lecture13.pdf · 2019. 2. 14. · 제13장파일처리 1. 스트림의개념을이해한다

제13장 파일처리

1. 스트림의 개념을 이해한다. 2. 객체 지향적인 방법을 사용하여 파일입

출력을 할수 있다. 3. 텍스트 파일과 이진 파일의 차이점을 이

해한다. 4. 순차 파일과 임의 접근 파일의 차이점을

이해한다.

Page 2: 쉽게 풀어쓴 C 프로그래밍 - Sangji Universitycompiler.sangji.ac.kr/lecture/windows/2018/lecture13.pdf · 2019. 2. 14. · 제13장파일처리 1. 스트림의개념을이해한다

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

Page 3: 쉽게 풀어쓴 C 프로그래밍 - Sangji Universitycompiler.sangji.ac.kr/lecture/windows/2018/lecture13.pdf · 2019. 2. 14. · 제13장파일처리 1. 스트림의개념을이해한다

스트림(stream)

스트림(stream)은 “순서가있는데이터의연속적인흐름”이다.

스트림은입출력을물의흐름처럼간주하는것이다.

Page 4: 쉽게 풀어쓴 C 프로그래밍 - Sangji Universitycompiler.sangji.ac.kr/lecture/windows/2018/lecture13.pdf · 2019. 2. 14. · 제13장파일처리 1. 스트림의개념을이해한다

입출력관련클래스들

Page 5: 쉽게 풀어쓴 C 프로그래밍 - Sangji Universitycompiler.sangji.ac.kr/lecture/windows/2018/lecture13.pdf · 2019. 2. 14. · 제13장파일처리 1. 스트림의개념을이해한다

파일쓰기

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 소멸자가파일을닫는다.

}

Page 6: 쉽게 풀어쓴 C 프로그래밍 - Sangji Universitycompiler.sangji.ac.kr/lecture/windows/2018/lecture13.pdf · 2019. 2. 14. · 제13장파일처리 1. 스트림의개념을이해한다

파일읽기

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 소멸자가파일을닫는다.

}

Page 7: 쉽게 풀어쓴 C 프로그래밍 - Sangji Universitycompiler.sangji.ac.kr/lecture/windows/2018/lecture13.pdf · 2019. 2. 14. · 제13장파일처리 1. 스트림의개념을이해한다

파일모드

Page 8: 쉽게 풀어쓴 C 프로그래밍 - Sangji Universitycompiler.sangji.ac.kr/lecture/windows/2018/lecture13.pdf · 2019. 2. 14. · 제13장파일처리 1. 스트림의개념을이해한다

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

}

Page 9: 쉽게 풀어쓴 C 프로그래밍 - Sangji Universitycompiler.sangji.ac.kr/lecture/windows/2018/lecture13.pdf · 2019. 2. 14. · 제13장파일처리 1. 스트림의개념을이해한다

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

Page 10: 쉽게 풀어쓴 C 프로그래밍 - Sangji Universitycompiler.sangji.ac.kr/lecture/windows/2018/lecture13.pdf · 2019. 2. 14. · 제13장파일처리 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;

}

Page 11: 쉽게 풀어쓴 C 프로그래밍 - Sangji Universitycompiler.sangji.ac.kr/lecture/windows/2018/lecture13.pdf · 2019. 2. 14. · 제13장파일처리 1. 스트림의개념을이해한다

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

파일에서읽은데이터를객체로벡터에저장했다가다시꺼내서화면에출력해보자.

Page 12: 쉽게 풀어쓴 C 프로그래밍 - Sangji Universitycompiler.sangji.ac.kr/lecture/windows/2018/lecture13.pdf · 2019. 2. 14. · 제13장파일처리 1. 스트림의개념을이해한다

Solution

class TempData {

public:

int hour;

double temperature;

};

int main()

{

ifstream is{ "temp.txt" };

if (!is) { // ! 연산자오버로딩cerr << "파일오픈에실패하였습니다" << endl;

exit(1);

}

vector<TempData> temps;

Page 13: 쉽게 풀어쓴 C 프로그래밍 - Sangji Universitycompiler.sangji.ac.kr/lecture/windows/2018/lecture13.pdf · 2019. 2. 14. · 제13장파일처리 1. 스트림의개념을이해한다

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;

}

Page 14: 쉽게 풀어쓴 C 프로그래밍 - Sangji Universitycompiler.sangji.ac.kr/lecture/windows/2018/lecture13.pdf · 2019. 2. 14. · 제13장파일처리 1. 스트림의개념을이해한다

멤버함수를이용한파일입출력

get(), put()

#include <iostream>

#include <fstream>

using namespace std;

int main()

{

ifstream is{ "scores.txt" };

if (!is) { // ! 연산자오버로딩cerr << "파일오픈에실패하였습니다" << endl;

exit(1);

}

Page 15: 쉽게 풀어쓴 C 프로그래밍 - Sangji Universitycompiler.sangji.ac.kr/lecture/windows/2018/lecture13.pdf · 2019. 2. 14. · 제13장파일처리 1. 스트림의개념을이해한다

멤버함수를이용한파일입출력

get(), put()

char c;

is.get(c); // 하나의문자를읽는다.

while (!is.eof()) // 파일의끝이아니면{

cout << c;

is.get(c);

}

cout << endl;

return 0;

}

Page 16: 쉽게 풀어쓴 C 프로그래밍 - Sangji Universitycompiler.sangji.ac.kr/lecture/windows/2018/lecture13.pdf · 2019. 2. 14. · 제13장파일처리 1. 스트림의개념을이해한다

예제

#include <string>

#include <iostream>

using namespace std;

int main() {

string address;

cout << "주소를입력하시오: ";

getline(cin, address);

cout << "안녕! " << address << "에사시는분" << endl;

return 0;

}

Page 17: 쉽게 풀어쓴 C 프로그래밍 - Sangji Universitycompiler.sangji.ac.kr/lecture/windows/2018/lecture13.pdf · 2019. 2. 14. · 제13장파일처리 1. 스트림의개념을이해한다

출력형식지정

Page 18: 쉽게 풀어쓴 C 프로그래밍 - Sangji Universitycompiler.sangji.ac.kr/lecture/windows/2018/lecture13.pdf · 2019. 2. 14. · 제13장파일처리 1. 스트림의개념을이해한다

Lab: 줄번호를붙여보자.

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

Page 19: 쉽게 풀어쓴 C 프로그래밍 - Sangji Universitycompiler.sangji.ac.kr/lecture/windows/2018/lecture13.pdf · 2019. 2. 14. · 제13장파일처리 1. 스트림의개념을이해한다

Solution

int main()

{

ifstream is("scores.txt");;

ofstream os("result.txt"); ;

if (is.fail()) {

cerr << "파일오픈실패" << endl;

exit(1);

}

if (os.fail()) {

cerr << "파일오픈실패" << endl;

exit(1);

}

Page 20: 쉽게 풀어쓴 C 프로그래밍 - Sangji Universitycompiler.sangji.ac.kr/lecture/windows/2018/lecture13.pdf · 2019. 2. 14. · 제13장파일처리 1. 스트림의개념을이해한다

Solution

char c;

int line_number = 1;

is.get(c);

os << line_number << ": ";

while (!is.eof())

{

os << c;

if (c == '\n') {

line_number++;

os << line_number << ": ";

}

is.get(c);

}

return 0;

}

Page 21: 쉽게 풀어쓴 C 프로그래밍 - Sangji Universitycompiler.sangji.ac.kr/lecture/windows/2018/lecture13.pdf · 2019. 2. 14. · 제13장파일처리 1. 스트림의개념을이해한다

텍스트와이진파일

Page 22: 쉽게 풀어쓴 C 프로그래밍 - Sangji Universitycompiler.sangji.ac.kr/lecture/windows/2018/lecture13.pdf · 2019. 2. 14. · 제13장파일처리 1. 스트림의개념을이해한다

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

Page 23: 쉽게 풀어쓴 C 프로그래밍 - Sangji Universitycompiler.sangji.ac.kr/lecture/windows/2018/lecture13.pdf · 2019. 2. 14. · 제13장파일처리 1. 스트림의개념을이해한다

이진파일입출력

ofstream os{ "test.dat", ofstream::binary };

int x=5;

os.write((char*)&x, sizeof(int)); // 정수변수는 4바이트로이루어져있다.

Page 24: 쉽게 풀어쓴 C 프로그래밍 - Sangji Universitycompiler.sangji.ac.kr/lecture/windows/2018/lecture13.pdf · 2019. 2. 14. · 제13장파일처리 1. 스트림의개념을이해한다

예제

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;

}

Page 25: 쉽게 풀어쓴 C 프로그래밍 - Sangji Universitycompiler.sangji.ac.kr/lecture/windows/2018/lecture13.pdf · 2019. 2. 14. · 제13장파일처리 1. 스트림의개념을이해한다

예제

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;

}

Page 26: 쉽게 풀어쓴 C 프로그래밍 - Sangji Universitycompiler.sangji.ac.kr/lecture/windows/2018/lecture13.pdf · 2019. 2. 14. · 제13장파일처리 1. 스트림의개념을이해한다

Lab: 이진파일복사프로그램

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

Page 27: 쉽게 풀어쓴 C 프로그래밍 - Sangji Universitycompiler.sangji.ac.kr/lecture/windows/2018/lecture13.pdf · 2019. 2. 14. · 제13장파일처리 1. 스트림의개념을이해한다

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);

Page 28: 쉽게 풀어쓴 C 프로그래밍 - Sangji Universitycompiler.sangji.ac.kr/lecture/windows/2018/lecture13.pdf · 2019. 2. 14. · 제13장파일처리 1. 스트림의개념을이해한다

Solution

#if 1

dest << source.rdbuf();

#else

if (source.is_open() && dest.is_open()) {

while (!source.eof()) {

dest.put(source.get());

}

}

#endif

return 0;

}

Page 29: 쉽게 풀어쓴 C 프로그래밍 - Sangji Universitycompiler.sangji.ac.kr/lecture/windows/2018/lecture13.pdf · 2019. 2. 14. · 제13장파일처리 1. 스트림의개념을이해한다

임의접근파일

순차접근(sequential access) 방법: 데이터를파일의처음부터순차적으로읽거나기록하는방법

임의접근(random access) 방법: 파일의어느위치에서든지읽기와쓰기가가능한방법

Page 30: 쉽게 풀어쓴 C 프로그래밍 - Sangji Universitycompiler.sangji.ac.kr/lecture/windows/2018/lecture13.pdf · 2019. 2. 14. · 제13장파일처리 1. 스트림의개념을이해한다

임의접근파일의원리

파일위치표시자: 읽기와쓰기동작이현재어떤위치에서이루어지는지를나타낸다.

강제적으로파일위치표시자를이동시키면임의접근이가능

파일 위치 표시자

Page 31: 쉽게 풀어쓴 C 프로그래밍 - Sangji Universitycompiler.sangji.ac.kr/lecture/windows/2018/lecture13.pdf · 2019. 2. 14. · 제13장파일처리 1. 스트림의개념을이해한다

임의접근관련함수

seekg(long offset, seekdir way);

is.seekg(ios::beg, 100);

is.seekg(ios::end, 0);

is.seekg(ios::cur, -100);

Page 32: 쉽게 풀어쓴 C 프로그래밍 - Sangji Universitycompiler.sangji.ac.kr/lecture/windows/2018/lecture13.pdf · 2019. 2. 14. · 제13장파일처리 1. 스트림의개념을이해한다

Page 33: 쉽게 풀어쓴 C 프로그래밍 - Sangji Universitycompiler.sangji.ac.kr/lecture/windows/2018/lecture13.pdf · 2019. 2. 14. · 제13장파일처리 1. 스트림의개념을이해한다

예제

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

Page 34: 쉽게 풀어쓴 C 프로그래밍 - Sangji Universitycompiler.sangji.ac.kr/lecture/windows/2018/lecture13.pdf · 2019. 2. 14. · 제13장파일처리 1. 스트림의개념을이해한다

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();

Page 35: 쉽게 풀어쓴 C 프로그래밍 - Sangji Universitycompiler.sangji.ac.kr/lecture/windows/2018/lecture13.pdf · 2019. 2. 14. · 제13장파일처리 1. 스트림의개념을이해한다

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;

}

Page 36: 쉽게 풀어쓴 C 프로그래밍 - Sangji Universitycompiler.sangji.ac.kr/lecture/windows/2018/lecture13.pdf · 2019. 2. 14. · 제13장파일처리 1. 스트림의개념을이해한다

Lab: 행맨업그레이드

Page 37: 쉽게 풀어쓴 C 프로그래밍 - Sangji Universitycompiler.sangji.ac.kr/lecture/windows/2018/lecture13.pdf · 2019. 2. 14. · 제13장파일처리 1. 스트림의개념을이해한다

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);

}

Page 38: 쉽게 풀어쓴 C 프로그래밍 - Sangji Universitycompiler.sangji.ac.kr/lecture/windows/2018/lecture13.pdf · 2019. 2. 14. · 제13장파일처리 1. 스트림의개념을이해한다

Solution

while (true) {

string r = words[rand() % words.size()];

cout << "이번에선택된단어는 " << r << endl;

getch();

}

return 0;

}

Page 39: 쉽게 풀어쓴 C 프로그래밍 - Sangji Universitycompiler.sangji.ac.kr/lecture/windows/2018/lecture13.pdf · 2019. 2. 14. · 제13장파일처리 1. 스트림의개념을이해한다

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

Page 40: 쉽게 풀어쓴 C 프로그래밍 - Sangji Universitycompiler.sangji.ac.kr/lecture/windows/2018/lecture13.pdf · 2019. 2. 14. · 제13장파일처리 1. 스트림의개념을이해한다

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();

Page 41: 쉽게 풀어쓴 C 프로그래밍 - Sangji Universitycompiler.sangji.ac.kr/lecture/windows/2018/lecture13.pdf · 2019. 2. 14. · 제13장파일처리 1. 스트림의개념을이해한다

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;

}

Page 42: 쉽게 풀어쓴 C 프로그래밍 - Sangji Universitycompiler.sangji.ac.kr/lecture/windows/2018/lecture13.pdf · 2019. 2. 14. · 제13장파일처리 1. 스트림의개념을이해한다

Q & A