'InputFileStream'에 해당되는 글 1건

  1. 2012.10.24 스트림 - 파일 I/O
파일 입출력의 기본단계

1. 필요한 헤더 파일을 포함한다 : fstream, iostream

2. 스트림을 관리하기 위해 객체를 생성한다. 

ofstream (Output File Stream)

ifstream (Input  File Stream)

3. 생성된 객체를 하나의 파일에 연결 시킨다

open()함수

경우데 따라서는 객체 생성과 동시에 파일에 연결시킬 수도 있다.

4. 표준입력을 사용하는 것과 동일한 방법으로 그 객체를 사용한다.

5. 사용이 끝난 객체에 대해 파일과의 연결을 닫는다.


파일 열기와 닫기

open() : 파일 입출력을 위해 파일을 열어주는 맴버함수로, 파일의 이름과 열기모드, 접근모드 세가지 정보를 인자로 받는다

  void open(const charfilenameint modeint access);

파일 열기모드

- ios::app : 파일에 끝에 추가한다.

- ios::ate : 파일이 열릴 때, 파일의 끝을 찾는다.

- ios::binary : 이진 형식으로 파일을 연다.

- nocreate : 파일이 존재하지 않을경우 열기에 실패한다.

- noreplace : 파일이 이미 존재하는 경우에 열기에 실패한다.

- ios::trunc : 파일이 존재하는 경우에 그 파일의 크기를 0으로 만든다.


파일의 열기와 닫기

- is_open() : open의 실행이 실패하였을경우 false를 반환하는 맴버 함수

- close() : 열린 파일을 닫는 맴버 함수

- eof() : 파일의 끝에 도달했는지 검사(파일 끝이라면 0이 아닌값을 반환하고 파일의 끝이 아니라면 0을 반환)


텍스트파일 출력

streamget (char& ch);  //파일에서 단일문자 입력

ostream& put (char& ch);   //파일로 단일문자 출력

 

istreamget (charbuf, int num, char delim=\n);

//파일로부터 최대num개의 문자를 \n이 입력되기전까지 buf로 입력

 

istreamgetline (char* buf, int num, char delim=\n);

//파일로부터 최대num개의 문자를 \n이 입력되기전까지 buf로입력

 

int  peek();      //파일의 다음문자를 추출하지않고엿보기

istreamputback (char c);  //파일로부터 읽어들인 마지막 문자파일로 되돌리기

ostreamflush();         // 출력버퍼가 가득차기전에 버터의 내용파일로 출력


예제) source.txt파일에 있는 내용을 dest.txt에 복사!

#include <iostream>

#include <fstream>

using namespace std;


const int MAXLEN = 255;

int main(void)

{

         char infile[20] = "source.txt";

         char outfile[20] = "dest.txt";

         char input[MAXLEN];

 

         ifstream fin;

         ofstream fout;

         fin.open(infile);

         fout.open(outfile);

 

         while (!fin.eof()){

                  fin.getline(input, MAXLEN, '\n');  //source.txt에 있는 내용을 가져옴

                  fout << input << endl//dest.txt에 파일에 내용을 작성

         }

         cout << "입력끝~!" << endl;

         fin.close();  //파일을 닫음

         fout.close();

         return 0;

}


실행할때 소스코드와 함께 source.txt파일이 있어야함


이진파일 출력

이진파일 : 데이터가 컴퓨터의 내부적 표현 그대로 저장되는 파일

숫자를 저장하는데 있어서 반올림등의 변화없이 데이터가 그대로 저장되므로 더 정확하고, 처리속도가 빠르다.

2진 파일의 데이터를 다른시스템으로 옮기는 것은 표현방법의 차이로 문제가 발생할수 있다.

파일을 열 때, 이진모드(ios_base::binary)로 열어야 한다.

 istreamread (unsigned  charbufint  num);

//num크기만큼의이진데이터블록을파일로부터buf로입력

ostreamwrite (const  unsigned  charbufint  num);

//buf에있는num크기만큼의이진데이터를파일로출력


예제) 5명의 이름와 나이를 입력받아 이진파일로 작성후 다시 불러옴

#include <iostream>

#include <fstream>

 

using namespace std;

typedef struct {

         char name[20];

         int  age;

} Person;


const char* file = "person.dat";   //파일이름

ostream& operator << (ostream& os, Person& p)

{

         os << "이름: " << p.name << "\t나이: " << p.age;

         return os;

}

 

int main(void)

{

         ofstream fout;

         fout.open(file, ios_base::out | ios_base::binary);   //binary 모드로 파일을open

 

         Person myfriend;

 

         cout << "[5명의친구들의이름과나이를입력하여주십시오.]" << endl;

         for (int i=0; i<5; i++){

                  cout << i+1 << ". ";

                  cout << "\t이름: ";

                  cin >> myfriend.name;

                  cout << "\t나이: ";

                  cin >> myfriend.age;

 

                  fout.write((char*)&myfriend, sizeof(myfriend));      //입력받은이름과나이를파일에작성

                  cout << "----------------------------" << endl;

         }

         fout.close();     //파일을닫음

 

         cout << "[이진파일에서데이터를꺼내옵니다.]" << endl;

         ifstream fin;   

         fin.open(file, ios_base::in | ios_base::binary);     //binary모드로파일을염

 

         if (fin.is_open()) {

                  for (int i=0; i<5; i++){

                           //binary로저장되어있는데이터를불러옴

                           fin.read((char*)&myfriend, sizeof(myfriend));        

                           cout << myfriend << endl;

                  }

         }

         fin.close();

         return 0;

}



임의 접근파일(random file)의 입출력

임의접근파일 : 파일에서 처음부터 차례대로 접근하는것이 아니라, 원하는 곳으로 직접 이동하여 처리하는 파일

이진 파일과 마찬가지로 ios::binary로 접근해야 한다.

 istream& seekg (streampos offset, seek_dir origin);

ostream& seekp (streaampos offset, seek_dir origin);

//파일의 현재 입력위치를 origin의위치에서 offset만큼 떨어진 위치로 이동


streampos tellg();         //파일포인터의 현재위치 제공

streampos tellp();         

예제 파일 

RandomFileStream.cpp



'Developer > C / C++' 카테고리의 다른 글

파일크기 측정방법  (0) 2012.11.25
Namespace  (0) 2012.10.24
스트림 - 표준입출력(cout, cin)  (0) 2012.10.24
예외처리  (0) 2012.10.24
STL(Standard Template Library) for C++  (0) 2012.10.23
Posted by No names
,