#stl istreambuf_iterator, ostreambuf_iterator : 서식화(formatted)하지 않는 입출력

less than 1 minute read

사용자 입력은 서식화된 입력(공백 문자 무시 등)이 필요하지만 파일 입출력에서는 서식화된(formatted) 입력이 필요 없는 경우가 대부분이다. 서식화된 입출력은 쌩 입출력보다 처리를 하는 게 많아서 속도가 느린 게 당연하다. 공백 문자 무시 옵션을 켜도 되지만 이런 서식화 입출력 때문에 이걸 사용하는 건데, 이럴 바에는 서식화 처리를 하지 않는 istreambuf_iterator, ostreambuf_iterator 를 사용하자. 당연히 속도 면에서 상대가 안 된다. 바이너리 읽기 쓰기에 적합하다.

// 임시로 사용할 파일 이름
char tempName[256];
tmpnam_s(tempName);

// A ~ G 까지 중간에 공백, 탭, 줄바꿈을 끼어넣어 파일에 쓴다.
{
    std::ofstream outputFile(tempName);
    for (char i = 'A'; i < 'G'; ++i)
    {
        outputFile << i << GetSeperator(i); // ' ', '\t', '\n'
    }
}

// istream_iterator
{
    std::cout << "use istream_iterator :" << std::endl;
    std::ifstream inputFile(tempName);
    std::copy(std::istream_iterator<char>(inputFile),
              std::istream_iterator<char>(), std::ostream_iterator<char>(std::cout, ""));
    std::cout << std::endl << std::endl;
}

// istream_iterator(공백 문자 무시)
{
    std::cout << "use istream_iterator & unsetf(ios::skipws) :" << std::endl;
    std::ifstream inputFile(tempName);
    inputFile.unsetf(std::ios::skipws);
    std::copy(std::istream_iterator<char>(inputFile),
              std::istream_iterator<char>(), std::ostream_iterator<char>(std::cout, ""));
    std::cout << std::endl << std::endl;
}

// istreambuf_iterator
{
    std::cout << "use istreambuf_iterator : " << std::endl;
    std::ifstream inputFile(tempName);
    std::copy(std::istreambuf_iterator<char>(inputFile),
              std::istreambuf_iterator<char>(),
              std::ostreambuf_iterator<char>(std::cout));
    std::cout << std::endl;
}

// 임시 파일 삭제
remove(tempName);

nil

참고