C++ std :: streamは初めてで、いくつかのテストを行っています。私はこの簡単なコードを持っています:
int i = 10;
char c = 'c';
float f = 30.40f;
std::ofstream out("test.txt", std::ios::binary | std::ios::out);
if(out.is_open())
{
out<<i<<c<<f;
out.close();
}
ストリームがstd::ios::binary
に期待していますtest.txt
ファイルはi
、c
およびf
のバイナリ表現を持っていますが、代わりに10c30.4
。
私が間違っていることを教えていただけますか?
std::ios::binary
ストリームで行末変換を行わないことを約束します(およびテキストストリームとのその他の小さな動作の違い)。
あなたは見ることができます
Boost Spirit Karmaを使用した例を次に示します(ビッグエンディアンのバイト順を想定)。
#include <boost/spirit/include/karma.hpp>
namespace karma = boost::spirit::karma;
int main()
{
int i = 10;
char c = 'c';
float f = 30.40f;
std::ostringstream oss(std::ios::binary);
oss << karma::format(
karma::big_dword << karma::big_Word << karma::big_bin_float,
i, c, f);
for (auto ch : oss.str())
std::cout << std::hex << "0x" << (int) (unsigned char) ch << " ";
std::cout << "\n";
}
これはプリント
0x0 0x0 0x0 0xa 0x0 0x63 0x41 0xf3 0x33 0x33
生のバイナリデータを書き込むには、 ostream :: write を使用する必要があります。出力演算子では機能しません。
また、バイナリファイルから読み取って、演算子>>ではなく istream :: read を使用するかどうかも確認してください。
リンクには、バイナリデータの処理方法の例も含まれています。
だからあなたの例では:
int i = 10;
char c = 'c';
float f = 30.40f;
std::ofstream out("test.txt", std::ios::binary | std::ios::out);
if(out.is_open())
{
out.write(reinterpret_cast<const char*>(&i), sizeof(i));
out.write(&c, sizeof(c));
out.write(reinterpret_cast<const char*>(&f), sizeof(f));
out.close();
}