본문 바로가기

공부/c++

fstream, strstream, 임의접근메소드, 입출력상태 확인 메소드

반응형
참조 : http://blog.daum.net/youthdefy0/105


/*****************************************************************************************

 * Title        : 파일 입출력

 * Description  :

 *   문자열, 정수가 무작위로 입력되어 있는 파일에서 종류별로 읽어들이기

 *   (peek()함수로 한 문자 읽어들여서 종류를 판단하고, 다른 종류의 문자가 입력되면 

 *    putback(char)함수로 스트림에 반환한다.)

 //////////////////////////////////////////////////////////////////////////////////////////

 [ 파일 입출력 스트림 생성 ] : <fstream> 스트림의 생성자 또는 open()메소드 이용

    ifstream fin(const char *fileName, int mode, int access);   // 생성자 이용


    fstream     ; 입/출력용

    ifstream    ; 입력용

    ofstream    ; 출력용


  * mode (논리합 연산자 '|'로 복수 설정 가능.  ios_base::out | ios_base::trunc)

        ios_base::app       ; 파일의 끝에 추가

        ios_base::ate       ; 화일의 끝 찾아줌, 입출력 연산은 어디서나 가능

        ios_base::in        ; 입력용 - ifstream의 기본값

        ios_base::out       ; 출력용 - ofstream의 기본값

        ios_base::binary    ; 2진 형식 즉, 문자변환 안 됨

        ios_base::trunc     ; 동일한 이름을 가진 파일의 내용을 삭제한다.


        // 아래 두 flag는 구형 버전에선 지원했으나 지금은 없어졌음

        // ios_base::nocreate   ; 존재하는 파일 열기 - 없으면 fail

        // ios_base::noreplace  ; 새로 만들기 - 있으면 fail


 [ 문자배열 입출력 스트림 생성 ] : <strstream.h>; 스트림에 연결된 입출력배열은 파일처럼 보인다

    strstream   sio(char *buf, int size, int mode);

    istrstream  sin(const char *buf);

    ostrstream  sout(char *buf, int size, int mode);


 [ 2진 입출력 메소드 ]; 파일뿐만 아니라 문자배열 스트림(sin,sout,sio)에서도 사용 가능

    fin.get(ch);        // 스트림에 ch 입력 

    fout.put(ch);      // 스트림에 ch 출력


    // num만큼 또는 식별문자까지(식별문자 스트림에 반환) 입력

    fin.get(char *buf, int num, char delim='\n');


    // num만큼 또는 식별문자까지(식별문자 제거) 입력

    fin.getline(char *buf, int num, char delim='\n');


    fin.read(unsigned char *buf, int num);      // num만큼 입력

    fout.write(unsigned char *buf, int num);    // num만큼 출력


    fin.peek();           // 스트림에서 문자를 제거하지 않고 다음 문자 얻을 수 있음

    fin.putback(ch);   // 스트림에서 마지막으로 읽어 온 문자를 그 스트림에 반환


    fout.flush();        // 버퍼가 가득 차기 전 출력스트림 방출


    fin.gcount();       // 파일로부터 읽어들인 문자 수

    sout.pcount();    // 문자배열에 출력한 문자 수


 [ 임의 접근 메소드 ]

    fin.seekg(pos); // 읽기포인터를 맨 앞에서 pos만큼 떨어진 위치로 이동

    fout.seekp(pos); // 쓰기포인터를 맨 앞에서 pos만큼 떨어진 위치로 이동

    fin.seekg(streamoff offset, seek_dir org);  // 읽기포인터 org(ios_base::beg / cur / end)에서 offset만큼 이동

    fout.seekp(streamoff offset, seek_dir org); // 쓰기포인터 org에서 offset만큼 이동


    * origin

        ios_base::beg   ; 처음

        ios_base::cur   ; 현재 위치

        ios_base::end   ; 끝


    fin.tellg();     // 입력포인터의 위치 반환 (streampos 형)

    fout.tellp();   // 출력포인터의 위치 반환 (streampos 형)


 [ 입출력 상태 확인 메소드 ]

    스트림.rdstate();          // 정수로 코드화된 에러플래그의 현 상태 반환(에러 1, 아니면0)

    스트림.clear(플래그);   // 에러플래그 해제(0이면 모두 해제)

    스트림.bad();

    스트림.eof();

    스트림.fail();

    스트림.good();

  *****************************************************************************************/

#include <iostream>

#include <fstream>

#include <cctype>


using namespace std;


int main()

{

    ofstream fout("test.txt");

    if (!fout) {

        cout << "Can't open file!\n";

        exit(1);

    }


    fout << 123 << "this is a test" << 23 << endl;

    fout << "Hello there!" << 99 << "sdf" << endl;


    fout.close();


    ifstream fin("test.txt");

    if (!fin) {

        cout << "Can't open file!\n";

        exit(1);

    }


    char szBuffer[256];

    char *p;

    char ch;

    

    do {

        p = szBuffer;

        ch = fin.peek();

        

        if (isdigit(ch)) {

            while (isdigit(*p = fin.get()))  { p++; }

            fin.putback(*p);                // 숫자가 아닌 것은 도로 집어 넣는다.

            *p = '\0';

            cout << "Integer : " << atoi(szBuffer) << endl;

        } else if (isalpha(ch)) {

            while (isalpha(*p = fin.get()))  { p++; }

            fin.putback(*p);                // 알파벳이 아닌 것은 도로 집어 넣는다.

            *p = '\0';

            cout << "String : " << szBuffer << endl;

        } else  { fin.get(); }      // 숫자나 알파벳이 아니면 출력하지 않는다.

    } while (!fin.eof());           // 이 작업을 파일 끝까지 계속한다.


    fin.close();

    system("pause");

    return 0;

}

반응형