1 // endian_example.cpp  -------------------------------------------------------//
2 
3 //  Copyright Beman Dawes, 2006
4 
5 //  Distributed under the Boost Software License, Version 1.0.
6 //  See http://www.boost.org/LICENSE_1_0.txt
7 
8 //  See library home page at http://www.boost.org/libs/endian
9 
10 //----------------------------------------------------------------------------//
11 
12 #include <boost/endian/detail/disable_warnings.hpp>
13 
14 #include <iostream>
15 #include <cstdio>
16 #include <boost/endian/buffers.hpp>
17 #include <boost/static_assert.hpp>
18 
19 using namespace boost::endian;
20 
21 namespace
22 {
23   //  This is an extract from a very widely used GIS file format. Why the designer
24   //  decided to mix big and little endians in the same file is not known. But
25   //  this is a real-world format and users wishing to write low level code
26   //  manipulating these files have to deal with the mixed endianness.
27 
28   struct header
29   {
30     big_int32_buf_at     file_code;
31     big_int32_buf_at     file_length;
32     little_int32_buf_at  version;
33     little_int32_buf_at  shape_type;
34   };
35 
36   const char* filename = "test.dat";
37 }
38 
main(int,char * [])39 int main(int, char* [])
40 {
41   header h;
42 
43   BOOST_STATIC_ASSERT(sizeof(h) == 16U);  // reality check
44 
45   h.file_code   = 0x01020304;
46   h.file_length = sizeof(header);
47   h.version     = 1;
48   h.shape_type  = 0x01020304;
49 
50   //  Low-level I/O such as POSIX read/write or <cstdio> fread/fwrite is sometimes
51   //  used for binary file operations when ultimate efficiency is important.
52   //  Such I/O is often performed in some C++ wrapper class, but to drive home the
53   //  point that endian integers are often used in fairly low-level code that
54   //  does bulk I/O operations, <cstdio> fopen/fwrite is used for I/O in this example.
55 
56   std::FILE* fi = std::fopen(filename, "wb");  // MUST BE BINARY
57 
58   if (!fi)
59   {
60     std::cout << "could not open " << filename << '\n';
61     return 1;
62   }
63 
64   if (std::fwrite(&h, sizeof(header), 1, fi)!= 1)
65   {
66     std::cout << "write failure for " << filename << '\n';
67     return 1;
68   }
69 
70   std::fclose(fi);
71 
72   std::cout << "created file " << filename << '\n';
73 
74   return 0;
75 }
76