Format the output into ostringstream and then write it at once.

This fixes the garbled output when multiple printers are used in a
flowgraph.

closes #255
closes #420

Change-Id: I1012ed26371b4c67163545652f0a1ce0f576af9e
diff --git a/lib/misc_utils/message_printer_impl.cc b/lib/misc_utils/message_printer_impl.cc
index e8aa2d3..8342946 100644
--- a/lib/misc_utils/message_printer_impl.cc
+++ b/lib/misc_utils/message_printer_impl.cc
@@ -46,26 +46,27 @@
         gsmtap_hdr * header = (gsmtap_hdr *)message_plus_header;
         uint32_t frame_nr = be32toh(header->frame_number);
         
-        std::cout << d_prepend_string;
+        std::ostringstream out;
+        out << d_prepend_string;
         if (d_prepend_fnr)
         {
-            std::cout << frame_nr;
+            out << frame_nr;
         }
 
         if (d_prepend_fnr && d_prepend_frame_count)
         {
-            std::cout << " ";
+            out << " ";
         }
 
         if (d_prepend_frame_count)
         {
             // calculate fn count using libosmogsm
-            std::cout << osmo_a5_fn_count(frame_nr);
+            out << osmo_a5_fn_count(frame_nr);
         }
 
         if (d_prepend_fnr || d_prepend_frame_count)
         {
-            std::cout << ": ";
+            out << ": ";
         }
         
         int start_index = sizeof(gsmtap_hdr);
@@ -77,9 +78,11 @@
         
         for(int ii=start_index; ii<message_plus_header_len; ii++)
         {
-            printf(" %02x", message_plus_header[ii]);
+            out<<" "<<(std::hex)<<std::setw(2)<<std::setfill('0')<<(uint32_t)message_plus_header[ii];
         }
-        std::cout << std::endl;
+
+        out << std::endl;
+        std::cout << out.str() << std::flush;
     }
 
     message_printer::sptr