¿Está definido el modo predeterminado de implementación estándar?

Dado el siguiente código:

std::ofstream stream("somefile");

if (!stream)
{
   return 1;
}

Al invocar.escribir(....) y usandostdc ++ ylibc ++ la secuencia está en modo binario (std::ios::binary)

Sin embargo cuando se usaMSVC (2015 / 2017RC1) parece estar en modo texto o algo extraño, porque el archivo resultante es más grande de lo que realmente está escrito.

Pero si configuro explícitamente el modostd::ios::binary MSVC se comporta de manera similar a lastd::ofstream implementaciones de otras bibliotecas estándar mencionadas anteriormente.

Código de ejemplo:

#include <vector>
#include <cstdio>
#include <fstream>

std::size_t fsz(const char* filename) {
    std::ifstream in(filename, std::ifstream::ate | std::ifstream::binary);
    return static_cast<std::size_t>(in.tellg());
}

int main() {
   std::ofstream stream("filename");

   if (!stream)
      return 1;

   std::vector<unsigned long long int> v = {0x6F1DA2C6AC0E0EA6, 0x42928C47B18C31A2, 0x95E20A7699DC156A, 0x19F9C94F27FFDBD0};

   stream.write(reinterpret_cast<const char*>(v.data()),v.size() * sizeof(unsigned long long int));

   stream.close();

   printf("expect: %d\n", v.size() * sizeof(unsigned long long int));
   printf("file size: %d\n", fsz("filename"));

   return 0;
}

Salida para el código anterior cuando se ejecuta con msvc:

expect: 32 
file size: 33

Salida para el código anterior cuando se ejecuta con libc ++, stdc ++:

expect: 32 
file size: 32

La diferencia puede ser mucho mayor, depende de cuántos datos se escriban y el contenido de los datos.

al final mi pregunta sigue siendo la misma, ¿es un comportamiento indefinido o no especificado?

cambiar el vector anterior al siguiente hace que el ejemplo sea más obvio en cuanto a lo que está sucediendo.

std::vector<unsigned long long int> v = {0x0A0A0A0A0A0A0A0A, 0x0A0A0A0A0A0A0A0A, 0x0A0A0A0A0A0A0A0A, 0x0A0A0A0A0A0A0A0A};

Respuestas a la pregunta(2)

Su respuesta a la pregunta