seekg()는 C++의 iostream 라이브러리에 포함된 함수로, 파일 내 임의의 위치로 자유롭게 이동(seek)할 수 있게 해줍니다. C++ 파일 처리에서 주로 입력 스트림으로부터 다음에 추출할 문자의 위치를 지정할 때 사용됩니다.
문법
istream& seekg(streamoff offset, ios_base::seekdir dir);
istream& seekg(streampos position);
각 매개변수의 의미는 다음과 같습니다.
- position: 스트림 버퍼에서의 새로운 위치입니다.
- offset: dir 매개변수를 기준으로 한 스트림 버퍼 내 상대적 오프셋을 나타내는 streamoff 타입의 정수 값입니다.
- dir: 탐색 방향을 나타내며, ios_base::seekdir 타입의 객체로 오프셋 상수 값을 지정할 수 있습니다.
오프셋 기준 방향 상수
ios_base::beg: 스트림 버퍼의 시작 위치를 기준으로 합니다.ios_base::cur: 스트림 버퍼의 현재 위치를 기준으로 합니다.ios_base::end: 스트림 버퍼의 끝 위치를 기준으로 합니다.
필요한 단계 및 동작 순서
- 입출력 작업을 위해 데이터 파일을 엽니다.
- 파일에 'TutorialsPoint'라는 문자열을 기록합니다.
- 파일 시작 위치(beg)를 기준으로 9번째 위치로 이동합니다.
- 파일에서 다음 5개의 문자를 읽어 버퍼 F에 저장합니다.
- 버퍼 F 끝에 널(null) 종료 문자를 추가합니다.
- 버퍼의 내용을 출력합니다.
- 파일을 닫습니다.
예제 코드
#include <fstream>
#include <iostream>
using namespace std;
int main (int argc, char** argv) {
fstream File("d.txt", ios::in | ios::out );
File << "TutorialsPoint";
File.seekg(9, ios::beg);
char F[9];
File.read(F, 5);
F[5] = 0;
cout <<F<< endl;
File.close();
}
실행 결과
Point
결과 분석
위 예제에서 파일에는 먼저 "TutorialsPoint"라는 14자 문자열이 기록됩니다. 이때 File.seekg(9, ios::beg)는 파일 시작 위치에서 9칸 떨어진 곳, 즉 인덱스 0~8에 해당하는 "Tutorials" 다음 문자인 'P'로 읽기 위치를 이동시킵니다. 이후 File.read(F, 5)가 해당 위치부터 5개의 문자('P', 'o', 'i', 'n', 't')를 읽어 버퍼에 저장하므로, 최종적으로 화면에는 "Point"가 출력됩니다.
이처럼 seekg()를 활용하면 파일 전체를 처음부터 읽지 않고도 원하는 위치로 즉시 이동하여 필요한 데이터만 효율적으로 읽어올 수 있습니다.