SigUtil  0.95
Utility modules for modern C++
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
save.hpp
Go to the documentation of this file.
1 /*
2 Copyright© 2014 Akihiro Nishimura
3 
4 This software is released under the MIT License.
5 http://opensource.org/licenses/mit-license.php
6 */
7 
8 #ifndef SIG_UTIL_SAVE_HPP
9 #define SIG_UTIL_SAVE_HPP
10 
11 #include "../helper/helper_modules.hpp"
12 #include "../helper/maybe.hpp"
13 
14 #include <fstream>
15 #include <locale>
16 
17 
19 
20 namespace sig
21 {
22 
24 enum class WriteMode{
26  overwrite,
28  append
29 };
30 
31 
33 
43 inline void clear_file(FilepassString const& file_pass)
44 {
45  std::ofstream ofs(file_pass);
46  ofs << "";
47 }
48 
50 
52 
56 template <class T,
57  typename std::enable_if<!impl::container_traits<T>::exist>::type*& = enabler
58 >
59 inline void save_line(
60  T src,
62 {
63  ofs << src << std::endl;
64 }
65 
67 
71 template <class C,
72  typename std::enable_if<impl::container_traits<C>::exist>::type*& = enabler
73 >
74 void save_line(
75  C const& src,
76  typename impl::FStreamSelector<typename impl::container_traits<C>::value_type>::ofstream& ofs)
77 {
78  typename impl::FStreamSelector<typename impl::container_traits<C>::value_type>::ostreambuf_iterator streambuf_iter(ofs);
79  for (auto const& str : src){
80  std::copy(str.begin(), str.end(), streambuf_iter);
81  streambuf_iter = '\n';
82  }
83 }
84 
86 
112 template <class T,
113  typename std::enable_if<!impl::container_traits<T>::exist>::type*& = enabler
114 >
116  T src,
117  FilepassString const& file_pass,
118  WriteMode open_mode = WriteMode::overwrite)
119 {
121 
122  const auto mode = open_mode == WriteMode::overwrite ? std::ios::out : std::ios::out | std::ios::app;
123  typename impl::FStreamSelector<T>::ofstream ofs(file_pass, mode);
124  save_line(src, ofs);
125 }
126 
128 
152 template <class C,
153  typename std::enable_if<impl::container_traits<C>::exist>::type*& = enabler
154 >
156  C const& src,
157  FilepassString const& file_pass,
158  WriteMode open_mode = WriteMode::overwrite)
159 {
161 
162  const auto mode = open_mode == WriteMode::overwrite ? std::ios::out : std::ios::out | std::ios::app;
163  typename impl::FStreamSelector<typename impl::container_traits<C>::value_type>::ofstream ofs(file_pass, mode);
164  save_line(src, ofs);
165 }
166 
168 
170 
172 
199 template <class C,
200  typename std::enable_if<impl::container_traits<C>::exist && !impl::container_traits<typename impl::container_traits<C>::value_type>::exist>::type*& = enabler
201 >
202 void save_num(
203  C const& src,
204  FilepassString const& file_pass,
205  std::string delimiter,
206  WriteMode open_mode = WriteMode::overwrite)
207 {
208  save_line(cat(src, delimiter), file_pass, open_mode);
209 }
210 
212 
238 template <class CC,
239  typename std::enable_if<impl::container_traits<typename impl::container_traits<CC>::value_type>::exist>::type*& = enabler
240 >
241 void save_num(
242  CC const& src,
243  FilepassString const& file_pass,
244  std::string delimiter,
245  WriteMode open_mode = WriteMode::overwrite)
246 {
247  std::vector<std::string> tmp;
248 
249  for (auto const& line : src){
250  tmp.push_back(cat(line, delimiter));
251  }
252  save_line(tmp, file_pass, open_mode);
253 }
254 
256 
257  /*
258  //csvで保存
259  template <class Num>
260  void SaveCSV(std::vector<std::vector<Num>> const& data, std::vector<std::string> const& row_names, std::vector<std::string> const& col_names, std::wstring const& out_fullpass)
261  {
262  std::ofstream ofs(out_fullpass);
263 
264  //first row: field name
265  ofs << ",";
266  for (uint i = 1; i < data[0].size() + 1; ++i){
267  auto name = i - 1 < col_names.size() ? col_names[i - 1] : "";
268  ofs << i << ". " << name << ",";
269  }
270  ofs << "\n";
271 
272  //first col: field name
273  for (uint j = 0; j < data.size(); ++j){
274  auto name = j < row_names.size() ? row_names[j] : "";
275  ofs << j + 1 << ". " << name << ",";
276 
277  for (auto e : data[j]){
278  ofs << e << ",";
279  }
280  ofs << "\n";
281  }
282  }
283  */
284 }
285 
286 #endif
void clear_file(FilepassString const &file_pass)
ファイル内容の初期化
Definition: save.hpp:43
void * enabler
auto cat(C &&container, typename sig::impl::identity< S >::type const &delimiter, std::locale osstream_locale=std::locale("")) -> S
コンテナ中の各文字列や数値を結合
Definition: manipulate.hpp:155
WriteMode
SaveLine, SaveNum の保存に関する設定
Definition: save.hpp:24
void save_num(C const &src, FilepassString const &file_pass, std::string delimiter, WriteMode open_mode=WriteMode::overwrite)
数値列(ex:ベクトル)の保存
Definition: save.hpp:202
void save_line(T src, typename impl::FStreamSelector< T >::ofstream &ofs)
ファイルへ1行ずつ保存
Definition: save.hpp:59
#define SIG_FILE_LOCALE_INIT
Definition: array.hpp:15
auto copy(C &&src) -> RC
別の種類のコンテナに要素をコピーする