FC2ブログ

[std::istringstream, std::getline] 文字列 split (区切り文字 = 任意の1文字)

■ std::istringstream と std::getline (区切り文字 = 任意の1文字; 第3引数無 = '\n' 設定) を組み合わせる事により、
  文字列を任意の1文字にて分割可能。
■ テンプレート化により、T=double,float,int/std::string 等に対応。
  但し、
  std::istringstream を2段階 (下層 istringstream にて、テンプレート化対応) 用いる事が必須。
  ・・・ std::string → double 変換部を、T field; istr >> field; (★ポイント) にて実装。
  → 文字ブロック内の空白文字はNGだが、区切り文字近傍の空白文字は分割には影響しない。
    (例; ABC,DEF,GHI と ABC, DEF, GHI は同じ結果となる。・・・ , G  HI 等の間に空白文字はダメ)
    (例; 11.1,22.2,33.3 と 11.1, 22.2, 33.3 は同じ結果となる。)

" splitd.h
======================================================
#include <string>
#include <sstream>
#include <vector>

#ifndef SPLITD_H_
#define SPLITD_H_

template <typename T>
std::vector<T> splitd (const std::string& string, const char& delimiter);

#endif /* SPLITD_H_ */
======================================================

" splitd.cpp
======================================================
#include "splitd.h"
template <typename T>
std::vector<T> splitd (const std::string& string, const char& delimiter)
{
std::istringstream iss(string);

std::vector<T> result;
std::string line;
while(std::getline(iss, line, delimiter))
{
std::istringstream istr(line);
T field;
istr >> field;
result.push_back(field);
}

return (result);
}
// テンプレート明示的実体化
template std::vector<double> splitd (const std::string& string, const char& delimiter);
template std::vector<std::string> splitd (const std::string& string, const char& delimiter);
======================================================

" main.cpp
======================================================
#include <iostream>
#include <string>
#include <vector>
#include "splitd.h"

int main (void)
{
const std::string strs = "ABC,DEF,GHI";
char delimiters = ',';
std::vector<std::string> VAS1Dd = splitd<std::string>(strs, delimiters);
for (auto & e : VAS1Dd)
{
std::cout << e << std::endl;
}

const std::string strd = "11.1,22.2,33.3";
char delimiterd = ',';
std::vector<double> VAD1Dd = splitd<double>(strd, delimiterd);
for (auto & e : VAD1Dd)
{
std::cout << e << std::endl;
}

return (0);
}
======================================================


参考文献:
■ C++ テンプレート ヘッダと実装を別にした時に起こること
■ テンプレートの実装をヘッダに書かなければならない理由

スポンサーサイト



[std::istringstream] 文字列 split (区切り文字 = 空白)

■ std::istringstream (区切り文字 = 空白) により文字列を分割可能
■ テンプレート化により、T=double,float,int/std::string 等に対応。
  ヘッダとソース分離の為、ヘッダ内にテンプレートの明示的実体化。

" split.h
======================================================
#include <string>
#include <sstream>
#include <vector>

#ifndef SPLIT_H_
#define SPLIT_H_

template <typename T>
std::vector<T> split (const std::string& string);

#endif /* SPLIT_H_ */
======================================================

" split.cpp
======================================================
#include "split.h"
template <typename T>
std::vector<T> split (const std::string& string)
{
std::istringstream iss(string);

std::vector<T> result;
T field;
while (iss >> field)
{
result.push_back(field);
}

return (result);
}
// テンプレート明示的実体化
template std::vector<double> split (const std::string& string);
template std::vector<std::string> split (const std::string& string);
======================================================

" main.cpp
======================================================
#include <iostream>
#include <string>
#include <vector>
#include "split.h"

int main (void)
{
const std::string sstr = "abc def ghi";
std::vector<std::string> VAS1D = split<std::string>(sstr);
for (auto & e : VAS1D)
{
std::cout << e << std::endl;
}

const std::string dstr = "12.3 45.6 78.9";
std::vector<double> VAD1D = split<double>(dstr);
for (auto & e : VAD1D)
{
std::cout << e << std::endl;
}

return (0);
}
======================================================


参考文献:

[C/C++] ヘッダファイル種類

■ C/C++ ヘッダファイル種類
ヘッダ種類 備考
C系 stdio.h, string.h, stdlib.h, ...
C系→C++ cstdio, cstring, cstdlib, ...
C++ (旧→新) iostream, string, ... 旧→新にて、名前空間stdへ移行
C++ (新規追加) filesystem, optional, variant, any, memory_resource, string_view, ... C++17にて、実装 (予定)


参考文献:

[getopt] Cライブラリ関数 on Unix

■ Cライブラリ関数 on Unix (#include <unistd.h> → 内部で#include<getopt.h>) getopt関数 により、オプション/オプション引数、及び、引数処理が可能。
  → 当該ライブラリ内では、グローバル変数を用いている。
    (*optarg, optind, opterr, optopt)
尚、
  → オプションは引数よりも前に配置する必要がある。
  → オプション表記は1文字にしか対応していない。(ロングオプション非対応; 別途、getopt_long関数 等参照)
  → オプション引数として負数 (- ハイフン文字含) を与える場合には、-- にてオプションを終了させる必要がある。


参考文献: