¿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};