읽기 및 쓰기에 대해 파일 포인터가 하나만 있는 이유가 궁금합니다.
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
int main()
{
using namespace std;
// 1. 파일 입출력의 파일 포인터
// 테스트용 텍스트 파일 생성
fstream fs{ "test.txt", std::ios::out };
fs.close();
fs.open("test.txt");
fs << "THIS IS FILE STREAM.\n";
// 읽기 및 쓰기에 대한 현재 파일 포인터의 위치를 콘솔창에 출력
cout << "읽기 위치: " << fs.tellg() << '\n'; // 예상: 0 (파일의 시작 위치)
cout << "쓰기 위치: " << fs.tellp() << '\n'; // 예상: 22 (THIS IS FILE STREAM.\n를 쓴 후의 위치)
cout << endl;
// => 그러나 동일한 결과를 출력한다.
// 2. 문자열 스트림 입출력의 스트림 포인터
stringstream ss;
ss << "THIS IS STRING STREAM.\n";
string str;
ss >> str;
cout << "str: " << str << '\n'; // THIS
cout << "읽기 위치: " << ss.tellg() << '\n'; // 예상: 4 (THIS를 읽은 후의 위치)
cout << "쓰기 위치: " << ss.tellp() << '\n'; // 예상: 23 (THIS IS STRING STREAM.\n 이후의 위치)
return 0;
}
강의 시청 후에 learncpp.com에서 관련된 챕터를 복습하던 중에 파일 포인터는 읽기 및 쓰기에 대한 파일 포인터가 동일하다는 사실을 알게 되었습니다.
그래서 텍스트 파일을 생성해 임의의 문자열을 파일에 작성하고 tellg()와 tellq()로 확인해봤습니다.
결과는 동일한 위치를 반환했습니다. 읽기를 하지도 않았는데 말이죠.
그런데 일반적으로 생각해보면 입력과 출력에 대해 서로 개별적인 포인터를 가져야할 것 같은데 입출력의 기능을 모두 하는 스트림이 동일한 포인터를 가진다는 게 이해가 안돼서, 이번에는 다른 스트림인 문자열 스트림으로 테스트를 했습니다.
놀랍게도 문자열 스트림은 입출력에 대한 포인터를 독립적으로 보유하는지 tellg()와 tellq()는 서로 다른 위치를 반환했습니다.
구글링으로 답을 찾아보려 했지만 능력의 한계로 찾지 못 했습니다.
왜 입출력 파일 스트림만 동일한 포인터를 가지는 건가요?
단독 언어에 국한된 문제가 아니라 운영체제에 관련된 것일까요?