Почему следующий код записывает четыре байта при запуске на моем локальном компьютере с Windows с помощью Visual C ++, но записывает 4 дополнительных 0 байта при загрузке на Unix-сервер моей школы?
unsigned long temp = 1025;
ofstream file("test", ofstream::binary);
file.write((char*)&temp, sizeof(temp));
Вот результат использования xxd локально: 0104 0000
Вот результат на сервере Unix: 0104 0000 0000 0000
Это проблема с тем, в каком режиме я открываю файл?
long
имеет определенный размер реализации. Ваша система Windows использует 32 бита (4 байта) long
(даже 64-битная Windows использует 32-битную long
; в противном случае это редко можно увидеть в 64-битных ОС), хотя большинство, если не все, 64-битные UNIX-подобные системы, о которых я знаю, имеют 64-битные (8 байт) long
s. Так как ты пишешь sizeof(temp)
байты и temp
является unsigned long
вы получите разные размеры вывода в разных системах (вы также можете столкнуться с проблемами порядка байтов при переходе от машин с прямым порядком байтов к машинам с прямым порядком байтов).
Если вам нужен постоянный размер, используйте фиксированные типы ширины из <cstdint>
например, uint32_t
или же uint64_t
,
Других решений пока нет …