readwritefile.cpp raw

   1  // Copyright (c) 2015-present The Bitcoin Core developers
   2  // Copyright (c) 2017 The Zcash developers
   3  // Distributed under the MIT software license, see the accompanying
   4  // file COPYING or http://www.opensource.org/licenses/mit-license.php.
   5  
   6  #include <util/readwritefile.h>
   7  
   8  #include <util/fs.h>
   9  
  10  #include <algorithm>
  11  #include <cstdio>
  12  #include <string>
  13  #include <utility>
  14  
  15  std::pair<bool,std::string> ReadBinaryFile(const fs::path &filename, size_t maxsize)
  16  {
  17      FILE *f = fsbridge::fopen(filename, "rb");
  18      if (f == nullptr)
  19          return std::make_pair(false,"");
  20      std::string retval;
  21      char buffer[128];
  22      do {
  23          const size_t n = fread(buffer, 1, std::min(sizeof(buffer), maxsize - retval.size()), f);
  24          // Check for reading errors so we don't return any data if we couldn't
  25          // read the entire file (or up to maxsize)
  26          if (ferror(f)) {
  27              fclose(f);
  28              return std::make_pair(false,"");
  29          }
  30          retval.append(buffer, buffer+n);
  31      } while (!feof(f) && retval.size() < maxsize);
  32      fclose(f);
  33      return std::make_pair(true,retval);
  34  }
  35  
  36  bool WriteBinaryFile(const fs::path &filename, const std::string &data)
  37  {
  38      FILE *f = fsbridge::fopen(filename, "wb");
  39      if (f == nullptr)
  40          return false;
  41      if (fwrite(data.data(), 1, data.size(), f) != data.size()) {
  42          fclose(f);
  43          return false;
  44      }
  45      if (fclose(f) != 0) {
  46          return false;
  47      }
  48      return true;
  49  }
  50