Я очистил ваш код следующим образом. Хотя я не знаю, почему старый код выводит два байта, новый код выводит четыре.
#include <iostream>
#include <fstream>
#include <cstdint>
using std::cout;
using std::endl;
using std::uint16_t;
using std::ostream;
using std::ofstream;
using std::ios;
template <class T> void writeToStream(ostream& o, T& val)
{
o.write(reinterpret_cast<char *>(&val), sizeof(T));
cout << o.tellp() << endl; //always outputs 4
}
struct foo {
uint16_t a, b;
};
int main()
{
foo myFoo = {42, 42};
ofstream test("test.txt", ios::binary);
writeToStream(test, myFoo);
// Just let the stream "test" pass out of scope.
// It closes automatically.
//test.close();
return 0;
}
(В моей стандартной библиотеке нет cstdint, , поэтому я использовал short
вместо uint16_t,
, но я сомневаюсь, что это важно.)
Тип std::ofstream
является производным от std::ostream
. Функция writeToStream()
является более счастливой или, по крайней мере, более регулярной и более общей, если передана простой std::ostream
. Также, для информации: выпускать using namespace std;
почти никогда не рекомендуется в C ++.
Удачи.