7 #ifndef RETDEC_UTILS_FILE_IO_H
8 #define RETDEC_UTILS_FILE_IO_H
21 const std::size_t FILE_BURST_READ_LENGTH = 0x100000;
23 template <
typename N>
bool readBytes(
24 std::istream& fileStream,
25 std::vector<N>& result,
26 std::size_t desiredSize)
32 std::size_t previousSize = result.size();
33 result.resize(result.size() + desiredSize);
34 char* buffer =
reinterpret_cast<char*
>(result.data()) + previousSize;
43 fileStream.read(buffer, desiredSize);
44 if (fileStream.bad() || (!fileStream.eof() && fileStream.fail()))
50 std::size_t charsRead = fileStream.gcount();
51 if (result.size() != previousSize + charsRead)
52 result.resize(previousSize + charsRead);
56 std::vector<std::uint8_t> temp;
57 if (!readBytes<std::uint8_t>(fileStream, temp, desiredSize))
60 result.reserve(result.size() + temp.size());
62 for (
const auto& val : temp)
63 result.push_back(val & 0xFF);
69 template <
typename N>
bool writeBytes(
70 std::ostream& fileStream,
71 const std::vector<N>& data,
72 std::size_t desiredSize)
78 reinterpret_cast<const char*
>(data.data()),
81 return fileStream.good();
86 std::vector<std::uint8_t> bytesData;
87 for (std::size_t i = 0; i < desiredSize; ++i)
88 bytesData.push_back(data[i] & 0xFF);
90 return writeBytes<std::uint8_t>(fileStream, bytesData, desiredSize);
110 std::istream& fileStream,
111 std::vector<N>& result,
112 std::size_t start = 0,
113 std::size_t desiredSize = 0)
116 fileStream.seekg(start, std::ios::beg);
117 if (!fileStream.good())
120 const bool untilEof = !desiredSize;
122 desiredSize = FILE_BURST_READ_LENGTH;
125 std::size_t alreadyRead = 0;
126 while ((alreadyRead < desiredSize || untilEof) && !fileStream.eof())
128 if (!readBytes(fileStream, result, desiredSize))
134 alreadyRead += result.size();
154 const std::string& fileName,
155 std::vector<N>& result,
156 std::size_t start = 0,
157 std::size_t desiredSize = 0)
161 std::ifstream file(fileName, std::ios::in | std::ios::binary);
165 return readFile(file, result, start, desiredSize);
180 std::ostream& fileStream,
181 const std::vector<N>& data,
182 std::size_t start = 0,
183 std::size_t desiredSize = 0)
185 fileStream.seekp(start, std::ios::beg);
186 if (!fileStream.good())
191 desiredSize = data.size();
193 return writeBytes(fileStream, data, desiredSize);
208 const std::string& fileName,
209 const std::vector<N>& data,
210 std::size_t start = 0,
211 std::size_t desiredSize = 0)
215 std::ios::out | std::ios::trunc | std::ios::binary
220 bool ret =
writeFile(file, data, start, desiredSize);
bool writeFile(std::ostream &fileStream, const std::vector< N > &data, std::size_t start=0, std::size_t desiredSize=0)
Definition: file_io.h:179
bool readFile(std::istream &fileStream, std::vector< N > &result, std::size_t start=0, std::size_t desiredSize=0)
Definition: file_io.h:109
Definition: archive_wrapper.h:19