Учитывая следующий код:Определен ли режим по умолчанию для реализации потока?
std::ofstream stream("somefile");
if (!stream)
{
return 1;
}
При вызове .WRITE (....) и использование STDC++ и LibC++ поток в двоичном режиме (std::ios::binary
).
Однако при использовании MSVC(2015/2017RC1) это, кажется, в текстовом режиме или что-то странное, потому что результирующий файл больше, чем то, что на самом деле написано.
Но если я явно задал режим std::ios::binary
MSVC ведет себя аналогично реализациям других стандартных библиотек, упомянутых ранее.
Пример кода:
#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;
}
Выход для указанного выше кода при запуске с MSVC:
expect: 32
file size: 33
выход для приведенного выше кода при запуске с LIBC++, STDC++:
expect: 32
file size: 32
Разница может достигать m uch больше, это зависит от того, сколько данных записано и содержимое данных.
В конце мой вопрос остается тем же, не определено ли это неопределенное или неуказанное поведение?
изменение вышеуказанного вектора следующим образом делает пример более очевидным в отношении того, что происходит.
std::vector<unsigned long long int> v = {0x0A0A0A0A0A0A0A0A, 0x0A0A0A0A0A0A0A0A, 0x0A0A0A0A0A0A0A0A, 0x0A0A0A0A0A0A0A0A};
Просьба описать _exactly_ то, что вы видите. Чем больше? Что содержит файл? Где ваш вызов 'write()'? Представьте [MCVE]. –
@LightnessRacesinOrbit Я добавил пример. –