Advertisement
Guest User

fileutils.hh

a guest
May 14th, 2022
31
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.71 KB | None | 0 0
  1. #ifndef FILEUTILS_HH
  2. #define FILEUTILS_HH
  3.  
  4. #include <iostream>
  5. #include <string>
  6. #include <string_view>
  7. #include <vector>
  8. #include <algorithm>
  9. #include <functional>
  10. #include <cstdint>
  11.  
  12. namespace
  13. {
  14.   template<class T>
  15.   T convertEndianness(T number)
  16.   {
  17.     T res;
  18.     unsigned char *bytes = reinterpret_cast<unsigned char*>(&number);
  19.     for(int i = 0; i < sizeof(T); i++)
  20.     {
  21.       res <<= 8;
  22.       res |= bytes[i];
  23.     }
  24.     return res;
  25.   }
  26.  
  27.   template<class T>
  28.   void writeNumber(std::ostream &out, T number)
  29.   {
  30.     number = convertEndianness(number);
  31.     out.write(reinterpret_cast<char*>(&number), sizeof(T));
  32.   }
  33.  
  34.   template<>
  35.   void writeNumber(std::ostream &out, std::uint8_t number)
  36.   {
  37.     out.put(number);
  38.   }
  39.  
  40.   template<class T>
  41.   T readNumber(std::istream &in)
  42.   {
  43.     T res;
  44.     in.read(reinterpret_cast<char*>(&res), sizeof(T));
  45.     return convertEndianness(res);
  46.   }
  47.  
  48.   template<>
  49.   std::uint8_t readNumber(std::istream &in)
  50.   {
  51.     return std::uint8_t(in.get());
  52.   }
  53.  
  54.   void writeString(std::ostream &out, const std::string &str)
  55.   {
  56.     out.write(str.c_str(), str.size());
  57.     out.put('\0');
  58.   }
  59.  
  60.   std::string readString(std::istream &in)
  61.   {
  62.     std::string res;
  63.     for(char ch = in.get(); ch != '\0'; ch = in.get())
  64.       res.push_back(ch);
  65.     return res;
  66.   }
  67.  
  68.   std::uint64_t copyFile(std::istream &in,
  69.                          std::ostream &out,
  70.                          std::uint64_t nbytes = std::numeric_limits<std::uint64_t>::max())
  71.   {
  72.     std::uint64_t ncopied;
  73.     for(ncopied = 0; ncopied < nbytes; ++ncopied)
  74.     {
  75.       auto ch = in.get();
  76.       if(in.eof())
  77.         break;
  78.       out.put(ch);
  79.     }
  80.     return ncopied;
  81.   }
  82. }
  83.  
  84. #endif
  85.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement