Added write/read to/from key-value file
This commit is contained in:
parent
d75b9c3f27
commit
6f38286003
66
src/file_io.cpp
Normal file
66
src/file_io.cpp
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
#include "file_io.hpp"
|
||||||
|
#include "exceptions.hpp"
|
||||||
|
#include "util/string.hpp"
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
|
#include <fstream>
|
||||||
|
#include <exception>
|
||||||
|
#include <functional>
|
||||||
|
#include <unordered_map>
|
||||||
|
|
||||||
|
namespace gz {
|
||||||
|
|
||||||
|
template<typename Hash, typename Pred>
|
||||||
|
bool writeKeyValueFile(const std::string& filepath, const std::unordered_map<std::string, std::string, Hash, Pred>& content) {
|
||||||
|
bool success = false;
|
||||||
|
std::ofstream file(filepath.c_str());
|
||||||
|
if (file.is_open()) {
|
||||||
|
file << "# Written by writeKeyValueFile" << std::endl;
|
||||||
|
for (std::pair<std::string, std::string> line : content) {
|
||||||
|
file << line.first << " = " << line.second << std::endl;
|
||||||
|
}
|
||||||
|
file.close();
|
||||||
|
success = true;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
throw FileIOError("Could not open file: '" + filepath + "'", "writeKeyValueFile");
|
||||||
|
}
|
||||||
|
return success;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::unordered_map<std::string, std::string> readKeyValueFile(const std::string& filepath, bool removeSpaces) {
|
||||||
|
std::unordered_map<std::string, std::string> attr;
|
||||||
|
std::string line;
|
||||||
|
int eqPos;
|
||||||
|
std::ifstream file(filepath);
|
||||||
|
if (file.is_open()) {
|
||||||
|
while (file.good()) {
|
||||||
|
getline(file, line);
|
||||||
|
|
||||||
|
// ignore commented lines
|
||||||
|
if (line.find("#") != std::string::npos) { continue; }
|
||||||
|
|
||||||
|
// if "=" in line: split into key - value pair and store in map
|
||||||
|
if (line.find("=") != std::string::npos) {
|
||||||
|
if (removeSpaces) { // remove all whitespaces
|
||||||
|
line.erase(std::remove_if(line.begin(), line.end(), [](unsigned char x) { return std::isspace(x); }), line.end());
|
||||||
|
}
|
||||||
|
else { // remove whitespaces until after equal sign
|
||||||
|
eqPos = line.find("=");
|
||||||
|
line.erase(std::remove_if(line.begin(), line.begin() + eqPos + 2, [](unsigned char x) { return std::isspace(x); }), line.begin() + eqPos + 2);
|
||||||
|
}
|
||||||
|
eqPos = line.find("=");
|
||||||
|
attr[line.substr(0, eqPos)] = line.substr(eqPos+1, line.length());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
file.close();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
throw FileIOError("Could not open file: '" + filepath + "'", "readKeyValueFile");
|
||||||
|
}
|
||||||
|
return attr;
|
||||||
|
}
|
||||||
|
|
||||||
|
template bool writeKeyValueFile<std::hash<std::string>, std::equal_to<std::string>>(const std::string&, const std::unordered_map<std::string, std::string, std::hash<std::string>, std::equal_to<std::string>>&);
|
||||||
|
template bool writeKeyValueFile<util::string_hash, std::equal_to<>>(const std::string&, const std::unordered_map<std::string, std::string, util::string_hash, std::equal_to<>>&);
|
||||||
|
}
|
24
src/file_io.hpp
Normal file
24
src/file_io.hpp
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "util/string.hpp"
|
||||||
|
#include "util/string_conversion.hpp"
|
||||||
|
|
||||||
|
|
||||||
|
namespace gz {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Write a file that contains key = value pairs
|
||||||
|
* @details
|
||||||
|
* This template function is instantiated for the default unordered_map<string, string> and the util::string_map from util/string.hpp
|
||||||
|
* @throws FileIOError
|
||||||
|
*/
|
||||||
|
template<typename Hash, typename Pred>
|
||||||
|
bool writeKeyValueFile(const std::string& filepath, const std::unordered_map<std::string, std::string, Hash, Pred>& content);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Read a file that contains key = value pairs
|
||||||
|
* @throws FileIOError
|
||||||
|
*/
|
||||||
|
std::unordered_map<std::string, std::string> readKeyValueFile(const std::string& filepath, bool removeSpaces=false);
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user