std :: ofstream com std :: ate não abrindo no final

Estou tentando abrir um arquivo para saída e anexá-lo. Depois de anexá-lo, desejo mover minha posição de saída para outro lugar do arquivo esubstituir dados existentes. Como eu entendo,std::ios_base::app vaiforça todas as gravações estejam no final do arquivo, que énão O que eu quero fazer. Como tal, acreditostd::ios_base::ate é o sinalizador correto para passar parastd::ofstream::open(). No entanto, parece não estar funcionando conforme o esperado:

// g++ test.cpp
// clang++ test.cpp
// with and without -std=c++11
#include <iostream>
#include <fstream>

int main() {
    std::streampos fin, at;
    {
        std::ofstream initial;
        initial.open("test", std::ios_base::out | std::ios_base::binary);
        if ( not initial.good() ) {
            std::cerr << "initial bad open" << std::endl;
            return 1;
        }
        int b = 100;
        initial.write((char*)&b, sizeof(b));
        initial.flush();
        if ( not initial.good() ) {
            std::cerr << "initial write bad" << std::endl;
            return 1;
        }
        fin = initial.tellp();
    }
    {
        std::ofstream check;
        check.open("test", std::ios_base::out | std::ios_base::binary | std::ios_base::ate);
        if ( not check.good() ) {
            std::cerr << "check bad open" << std::endl;
            return 1;
        }
        at = check.tellp();
        if ( fin != at ) {
            std::cerr << "opened at wrong position!\nfin:\t" << fin << "\n" << "at:\t" << at << std::endl;
            return 1;
        }
        int bb = 200;
        check.write((char*)&bb, sizeof(bb));
        check.flush();
        if ( not check.good() ) {
            std::cerr << "check write bad" << std::endl;
            return 1;
        }
        at = check.tellp();
    }
    if ( (fin + std::streampos(sizeof(int))) != at ) {
        std::cerr << "overwrite?\nfin:\t" << fin << "\n" << "at:\t" << at << std::endl;
        return 1;
    }
    return 0;
}

Em particular, parece questd::ios_base::ate faznão mova o ponteiro de saída inicial para o final com o exemplo visto acima. Obviamente, isso resultaria na primeira gravação substituindo o início do arquivo (que foi o que causou meu problema).

Parece que a implementação está incorreta ou entãocplusplus.com está incorreto ("A posição de saída começa no final do arquivo.") ecppreference.com é ambíguo ("procure o final do fluxo imediatamente após abrir": qual fluxo?).

Obviamente, há uma solução fácil: basta usarstream.seekp(0, std::ios_base::end).

Portanto, minha pergunta é a seguinte: meu código está incorreto? A implementação está incorreta? Os sites de referência estão incorretos? Qualquer insight seria apreciado.

questionAnswers(1)

yourAnswerToTheQuestion