C ++ fstream에서 내부 버퍼링 수준을 어떻게 발견/제어 할 수 있습니까?

StackOverflow https://stackoverflow.com/questions/351582

  •  20-08-2019
  •  | 
  •  

문제

내가 이것을한다 (고려 된 예) :

#include <iostream>
#include <fstream>

using namespace std;

int main(int argc, char* argv[])
{
    ifstream ifs(argv[1]);

    char ch;
    while(ifs.read(&ch, 1)) {
        cout << ch;
    }
}

iostream 라이브러리가 여기서 내부 버퍼링을 수행하고 OS 레벨에서 1 바이트 파일 읽기 작업의 Gazillions로 전환하지 않는다고 가정합니다.

다음과 같은 방법이 있습니까?

ㅏ) IFStream의 내부 버퍼의 크기를 찾으십니까?

비) IFStream의 내부 버퍼의 크기를 변경하십니까?

작은 덩어리에서 다중 기가 바이트 파일을 읽어야하는 파일 필터를 작성하고 있으며 다른 버퍼 크기로 실험하여 성능에 영향을 미칩니다.

도움이 되었습니까?

해결책

당신이 사용할 수있는 ios::rdbuf() A에 대한 포인터를 얻으려면 streambuf 물체. 이 객체는 스트림의 내부 버퍼를 나타냅니다.

전화해도됩니다 streambuf::pubsetbuf(char * s, streamsize n) 주어진 크기의 새로운 내부 버퍼를 설정합니다.

보다 이 링크 자세한 사항은.

편집하다: 다음은 귀하의 경우에 어떻게 보이는지입니다.


#include <iostream>
#include <fstream>
using namespace std;

int main(int argCount, char ** argList[])
{
    ifstream inStream(argList[1]);

    char myBuffer [512];
    inStream.rdbuf()->pubsetbuf(myBuffer, sizeof(myBuffer));

    char ch;
    while(inStream.read(&ch, 1))
    {
        cout << ch;
    }
}

편집하다: 지적한대로 litb, 실제 행동 streambuf::pubsetbuf "구현 정의"입니다.

버퍼와 함께 놀고 싶다면 상속하는 자신의 버퍼링 클래스를 굴려야 할 수도 있습니다. streambuf.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top