/*****************************************************************************************
* 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;
}