/ src / util / readwritefile.cpp
readwritefile.cpp
 1  // Copyright (c) 2015-2022 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 <limits>
13  #include <string>
14  #include <utility>
15  
16  std::pair<bool,std::string> ReadBinaryFile(const fs::path &filename, size_t maxsize)
17  {
18      FILE *f = fsbridge::fopen(filename, "rb");
19      if (f == nullptr)
20          return std::make_pair(false,"");
21      std::string retval;
22      char buffer[128];
23      do {
24          const size_t n = fread(buffer, 1, std::min(sizeof(buffer), maxsize - retval.size()), f);
25          // Check for reading errors so we don't return any data if we couldn't
26          // read the entire file (or up to maxsize)
27          if (ferror(f)) {
28              fclose(f);
29              return std::make_pair(false,"");
30          }
31          retval.append(buffer, buffer+n);
32      } while (!feof(f) && retval.size() < maxsize);
33      fclose(f);
34      return std::make_pair(true,retval);
35  }
36  
37  bool WriteBinaryFile(const fs::path &filename, const std::string &data)
38  {
39      FILE *f = fsbridge::fopen(filename, "wb");
40      if (f == nullptr)
41          return false;
42      if (fwrite(data.data(), 1, data.size(), f) != data.size()) {
43          fclose(f);
44          return false;
45      }
46      if (fclose(f) != 0) {
47          return false;
48      }
49      return true;
50  }