Bitcoin Core  26.99.0
P2P Digital Currency
readwritefile.cpp
Go to the documentation of this file.
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 }
Path class wrapper to block calls to the fs::path(std::string) implicit constructor and the fs::path:...
Definition: fs.h:33
FILE * fopen(const fs::path &p, const char *mode)
Definition: fs.cpp:26
bool WriteBinaryFile(const fs::path &filename, const std::string &data)
Write contents of std::string to a file.
std::pair< bool, std::string > ReadBinaryFile(const fs::path &filename, size_t maxsize)
Read full contents of a file and return them in a std::string.