アフィリエイト広告を利用しています

広告

この広告は30日以上更新がないブログに表示されております。
新規記事の投稿を行うことで、非表示にすることが可能です。
posted by fanblog

2018年03月30日

《その353》setf関数


 setf関数,unsetf関数

 fmtflags setf(fmtflags x);
 書式制御情報に x を加え(更新ではありません)、加える前の書式制御情報を返却します。

 void unsetf(fmtflags x);
 書式制御情報 x を消去します。


 以下、順を追って、プログラムを説明します。

★1.
 最初に、C++ のデフォルトの書式制御情報のままで、d の値を出力します。
C++ のデフォルトの書式制御情報では、ios_base::dec, ios_base::skipws の2つがセットされています。
 次に、
  ios_base::fmtflags f0
      = cout.setf(ios_base::scientific);
として、浮動小数点数の出力を、指数付き記法で行うように設定します。
f0 には、設定前の書式制御情報が代入されます。
ここで、f0 のビット構成を画面出力しますが、これは、変更前の、デフォルトの書式制御情報です。
 最後に、
  cout.unsetf(ios_base::dec);
で、ios_base::dec を除去します。これは、★2.で ios_base::scientific をセットする際に、ios_base::dec のビットがそのまま残ってしまうからです。
setf関数によるセットは、更新ではなく、加える形の変更です。


★2.
 まず、指数付き記法で d の値を出力します。
 次に、
  ios_base::fmtflags f1
      = cout.setf(ios_base::fixed);
として、浮動小数点数の出力を、固定小数点記法で行うように設定します。
f1 には、設定前の書式制御情報が代入されます。
ここで、f1 のビット構成を画面出力しますが、これは、指数付き記法の書式制御情報です。
 最後に、
  cout.unsetf(ios_base::scientific);
で、ios_base::scientific を除去します。

★3.
 固定小数点記法で d の値を出力します。
 次に、
  ios_base::fmtflags f2
      = cout.setf(f0);
として、最初の設定に戻します。
f2 には、戻す前の書式制御情報が代入されます。
ここで、f2 のビット構成を画面出力しますが、これは、固定小数点記法の書式制御情報です。
 最後に、
  cout.unsetf(ios_base::fixed);
で、ios_base::fixed を除去します。

★4.
 最初の書式制御情報に戻っていることを、d の値と書式制御情報のビット構成を画面出力して確認します。

 以下は、プログラムです。

#include <iostream>
using namespace std;

const unsigned bits
= numeric_limits<unsigned int>::digits;

const char* bits_of(unsigned x) {
static char str[bits + 1];

unsigned n = bits;
for (unsigned i = 0; i < n; i++) {
if ((x >> i) & 1U)
str[n - i - 1] = '1';
else
str[n - i - 1] = '0';
}
str[n] = '\0';
return str;
}

int main() {
double d = 123.456 * 123.456;

cout << "★1.\n";
cout << d << '\n';
ios_base::fmtflags f0
= cout.setf(ios_base::scientific);
cout << bits_of(f0) << "\n\n";
cout.unsetf(ios_base::dec);

cout << "★2.\n";
cout << d << '\n';
ios_base::fmtflags f1
= cout.setf(ios_base::fixed);
cout << bits_of(f1) << "\n\n";
cout.unsetf(ios_base::scientific);

cout << "★3.\n";
cout << d << '\n';
ios_base::fmtflags f2 = cout.setf(f0);
cout << bits_of(f2) << "\n\n";
cout.unsetf(ios_base::fixed);

cout << "★4.\n";
cout << d << '\n';
cout << bits_of(cout.flags())
<< '\n';
}

h12_0034.png

《その352》flags関数


 flags関数

 fmtflags flags() const;
 この形式の flags関数は、基底クラス ios_base に設定されているビットマスク型の書式制御情報を返却します。

 fmtflags flags(fmtflags x);
 この形式の flags関数は、基底クラス ios_base に設定されている書式制御情報を x に変更し、変更後の値を返却します。


 以下、順を追って、プログラムを説明します。

★1.
  ios_base::fmtflags f = cout.flags();
C++ の規定の fmtflags型書式制御情報を f に読み込みます。
そして、確認のため、そのビット構成と d の値を画面出力します。

★2.
  cout.flags(ios_base::scientific | ios_base::skipws);
として、浮動小数点数の出力を、指数付き記法で行うように設定します。
やはり、確認のため、そのビット構成と d の値を画面出力します。
ここで、
  ios_base::skipws
の指定は、特定の場合の読み込み時に空白文字を無視するようにするものです。
ここで指定する必要はありませんが、わざわざ指定した理由は、この指定をしないと書式制御情報のビット構成の第 0ビットが 0 になってしまい、浮動小数点数の出力と無関係の設定変更が同時に行われてしまうからです。

★3.
 浮動小数点数の出力を、固定小数点記法で行うように設定します。
やはり、確認のため、そのビット構成と d の値を画面出力します。

★4.
  cout.flags(f);
f に代入しておいた最初の書式制御情報を、セットします。
最後に、元通りの出力書式に戻っていることを確認します。

 以下は、プログラムです。

#include <iostream>
using namespace std;

const unsigned bits
= numeric_limits<unsigned int>::digits;

const char* bits_of(unsigned x) {
static char str[bits + 1];

unsigned n = bits;
for (unsigned i = 0; i < n; i++) {
if ((x >> i) & 1U)
str[n - i - 1] = '1';
else
str[n - i - 1] = '0';
}
str[n] = '\0';
return str;
}

int main() {
double d = 123.456 * 123.456;

cout << "★1.\n";
ios_base::fmtflags f = cout.flags();
cout << bits_of(f) << '\n';
cout << d << "\n\n";

cout << "★2.\n";
cout.flags(ios_base::scientific
| ios_base::skipws);
cout << bits_of(cout.flags())
<< '\n';
cout << d << "\n\n";

cout << "★3.\n";
cout.flags(ios_base::fixed
| ios_base::skipws);
cout << bits_of(cout.flags())
<< '\n';
cout << d << "\n\n";

cout << "★4.\n";
cout.flags(f);
cout << bits_of(cout.flags())
<< '\n';
cout << d << '\n';
}

h12_0033.png

2018年03月29日

《その351》浮動小数点数の書式


 浮動小数点数の書式

 浮動小数点数の書式指定は、形式と精度で行います。

 形式と精度は、
  ・scientific形式(精度は小数点以下の桁数最大値
  ・fixed形式(精度は小数点以下の桁数最大値
  ・形式指定無し(精度は全体の桁数最大値)
のようになっています、

 double型浮動小数点数の内部表現では、仮数部分の2進数桁数は、
先頭の 1 を含めて 53 です(於:一般的環境下)。
したがって、double型浮動小数点数の 10進数での有効数字桁数は、最大でおよそ、
  static_cast<int>(53 *log10(2.0)) = 15
です。


#include <math.h>
#include <iostream>
using namespace std;

int main() {
cout << " double型 浮動小数点数の内部表現では、\n"
"仮数部分の2進数桁数は、先頭の 1 を含\n"
"めて 53 です。\n";
cout << " したがって、double型浮動小数点数 の\n"
"10進数有効数字桁数は、最大でおよそ、\n"
"static_cast<int>(53 *log10(2.0)) = ";
cout << static_cast<int>(53 * log10(2.0)) << "\nです。\n";

cout << "\n------------------------\n";
cout.ios_base::precision(10); // 精度
double x = 123.456 * 123.456;

cout << "123.456 * 123.456 の計算結果\n";
cout << "精度の指定 : 10\n";
cout.setf(ios_base::scientific, ios_base::floatfield);
cout << "◇scientific形式:" << x << '\n';

cout.setf(ios_base::fixed, ios_base::floatfield);
cout << "◇fixed形式:" << x << '\n';

// 第1引数の 0 で、直前の fixed指定を解除
cout.setf(0, ios_base::floatfield);
cout << "◇通常表示:" << x;
cout << "\n------------------------\n";
}

h12_0032.png




2018年03月27日

《その350》double型の内部表現(2)


 double型の内部表現

 double型の内部表現を記述する際の考え方を使って、前回《349》、プログラムを使わずに、実際の数値の内部表現を求めました。

 下記のプログラムは、前回のときの考え方をそのまま使って作成したもので、あまりキレイなコードではありませんが、一応の確認には使えるため、今回はこれを利用して、いくつかの数値の内部表現を見てみました。

 前回と同じ値 0.6, −12.75 も試してみました。
また、2.0, 0.0625 なども試しましたが、これらの数値には 1 のビットが一つしかないので出力結果が 0 だらけになってしまって、一瞬、焦ります。落ち着いて考えれば納得できますが・・・。

 最後の numeric_limits<double> は、付け足しです。


#include <string>
#include <limits>
#include <iostream>
using namespace std;

string to_str(double x);

void print(string x) {
int n = 0;
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++)
cout << x[n++];
cout << ' ';
}
cout << '\n';
}

int main() {
cout << "◆double型数値の内部表現\n";
double d;
d = 0.6; cout << "◇" << d << '\n';
print(to_str(0.6));
d = -12.75; cout << "◇" << d << '\n';
print(to_str(-12.75));
d = 2.0; cout << "◇" << d << '\n';
print(to_str(2.0));
d = 0.0625; cout << "◇" << d << '\n';
print(to_str(0.0625));
d = -0.00012; cout << "◇" << d << '\n';
print(to_str(-0.00012));

cout << "\n\nnumeric_limits<double>\n";
cout << "最小値 : "
<< numeric_limits<double>::min()
<< '\n';
cout << "最大値 : "
<< numeric_limits<double>::max()
<< '\n';
cout << "桁数(2進) : "
<< numeric_limits<double>::digits
<< '\n';
cout << "桁数(10進) : "
<< numeric_limits<double>::digits10
<< '\n';
cout << "指数下限 : "
<< numeric_limits<double>::min_exponent
<< '\n';
cout << "指数下限(10進) : "
<< numeric_limits<double>::min_exponent10
<< '\n';
cout << "指数上限 : "
<< numeric_limits<double>::max_exponent
<< '\n';
cout << "指数上限(10進) : "
<< numeric_limits<double>::max_exponent10
<< '\n';
cout << "基数 : "
<< numeric_limits<double>::radix
<< '\n';
cout << "機械ε : "
<< numeric_limits<double>::epsilon()
<< '\n';
cout << "機械ε(\"1より大きい表現可能な最小数\""
"と\"1\"との差)\n";
}


string to_bits(int x) {
string str = "";
while (x) {
if (x % 2) str = '1' + str;
else str = '0' + str;
x /= 2;
}
return str;
}


string to_str(double x) {
// 左端の符号ビット
string sign = (x > 0) ? "0" : "1";
double tmp = (x > 0) ? x : -x;

int a = (int)tmp; // 整数部分(10進数)
double b = tmp - a; // 小数部分(10進数)

// 整数部分の2進数表現文字列
string str1 = to_bits(a);

int exp = 0; // 指数
if (str1 != "") {
exp = str1.size() - 1;
str1.erase(0, 1); // 先頭の 1 を削除
}

string str2 = ""; // 小数部分
int limit = 53 - exp; // 最大で 53桁必要
int f = 0; // フラグ
while (b) {
if (b * 2 >= 1) {
str2 = str2 + '1';
b = b - 0.5;

// 最初の 1 が出現したら f = 1
f = 1;
}
else str2 = str2 + '0';
b *= 2;

// str2 は最初の 1 の桁以下 limit桁の長さ
if (f) --limit;
if (!limit) break;
}

int exp2;
if (str2 != "") {
exp2 = str2.find('1');

// 整数部分がなければ
if (str1 == "") {
// str2 の先頭の 1 を削除
str2.erase(0, exp2 + 1);
// 指数の算出
exp = -exp2 - 1;
}
}
// 指数を変換
exp = exp + 1023;

// 指数部分の2進数表現文字列
string str3 = to_bits(exp);

// 指数部は 11桁
str3 = string(11 - str3.size(), '0') + str3;

// 仮数部は 52桁
str1 += str2;
str1 = str1 + string(52 - str1.size(), '0');

// 全体で 64桁
return sign + str3 + str1;
}

h12_0031.png




2018年03月26日

《その349》double型の内部表現(1)


double型の内部表現

 一般的な環境においては、1つの double型浮動小数点数を表現するのに、コンピュータ内部で 64ビットが使われます。

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 64ビットを上記のように表すと、
 ・最初の 1ビット(0 で表した部分)は、符号
 ・次の 11ビット(0 で表した部分)は、指数部
 ・残りの 52ビット(0 で表した部分)は、仮数部
という構成になっています。


例(1) −12.75

 負の数ですから、最初の符号ビットは
   1
です。

 次に、12.75 を 2進表記で表すと、
1100.11
すなわち
1.10011 × (2 の 3乗)
です。

指数部には、指数に 1023 を加えて格納するルールになっています。
したがって
3 + 1023 = 1026
1026 の 2進表記は
100 0000 0010 で、これが指数部になります。

 次に仮数部ですが、
   1.10011 の整数部分を省き
   10011 を格納するルールです。
仮数部は 52ビットありますから、
1001 10000000 00000000 00000000 00000000 00000000 00000000
となり、これが仮数部です。

 以上より、double型 −12.75 は、コンピュータ内部に、
11000000 00101001 10000000 00000000 00000000 00000000 00000000 00000000
という表現で格納されます。


例(2) 0.6

 正の数ですから、最初の符号ビットは
   0
です。

 次に、0.6 を 2進表記で表すと、
0.10011001100110011001100・・・
すなわち
1.0011001100110011001100・・・ × (2 の−1乗)
と、循環小数になってしまいます。

指数部には、指数に 1023 を加えて格納するルールになっています。
したがって
−1 + 1023 = 1022
1022 の 2進表記は
011 1111 1110 で、これが指数部になります。

 次に仮数部ですが、
   1.0011001100110011001100・・・ の整数部分を省き、
   0011001100110011001100・・・ を格納するルールです。
仮数部は 52ビットありますから、
0011 00110011 00110011 00110011 00110011 00110011 00110011
となり、これが仮数部です。

 以上より、double型 0.6 は、コンピュータ内部に、
00111111 11100011 00110011 00110011 00110011 00110011 00110011 00110011
という表現で格納されます。


2018年03月24日

《その348》ios_baseクラス(3)


 今回は、ios_baseクラスで定義されている fmtflags型の要素である showbase, oct, dec, hex についてです。
dec, hex に関しては、本ブログの《346》と一部が重複しますが、ここでは、定数 basefield に許される3つの値である oct, dec, hex をまとめて見ておきたいと思います。

 showbase の指定は、整数出力時に基数表示を付加します。
  os.setf(ios_base::showbase);

 ios_base::fmtflags が定義する定数 basefield に許される値
  oct 整数を 8進表記で入出力
  dec 整数を10進表記で入出力
  hex 整数を16進表記で入出力

 何進表記で入出力を行うかは、互いに排他的で両立し得ないため、これに関する定数(basefield)を1つだけ定義し、その取りうる値として oct, dec, hex が定められています。
下記プログラムの出力結果では、書式制御情報をビットの並びで表示していますが、該当ビットの立ち方からも、その排他性がわかります。


 また、下記プログラムでは、すべての出力を文字列ストリームに対して行い、最後に、文字列ストリームに蓄えられたデータを、一気に画面出力しています。


#include <sstream>
#include <string>
#include <iostream>
using namespace std;

const unsigned bits = numeric_limits<unsigned int>::digits;

const char* bits_of(unsigned x) {
static char str[bits + 1];

unsigned n = bits;
for (unsigned i = 0; i < n; i++) {
if ((x >> i) & 1U) str[n - i - 1] = '1';
else str[n - i - 1] = '0';
}
str[n] = '\0';
return str;
}

int main() {
ostringstream os;

os << "◆最初の書式制御情報\n";
os << bits_of(os.flags()) << "\n\n";


os << "◆書式変更:整数出力時に基数"
"表示を付加\n";
os << "os.setf(ios_base::showbase);\n";
os.setf(ios_base::showbase);
os << bits_of(os.flags()) << "\n\n";

os << "◆書式変更:整数を 8進表記で"
"出力\n";
os << "os.setf(ios_base::oct, "
"ios_base::basefield);\n";
os.setf(ios_base::oct,
ios_base::basefield);
os << bits_of(os.flags()) << '\n';
os << 2748 << "\n\n";

os << "◆書式変更:整数を10進表記で"
"出力\n";
os << "os.setf(ios_base::dec, "
"ios_base::basefield);\n";
os.setf(ios_base::dec,
ios_base::basefield);
os << bits_of(os.flags()) << '\n';
os << 2748 << "\n\n";

os << "◆書式変更:整数を16進表記で"
"出力\n";
os << "os.setf(ios_base::hex, "
"ios_base::basefield);\n";
os.setf(ios_base::hex,
ios_base::basefield);
os << bits_of(os.flags()) << '\n';
os << 2748 << "\n\n";

// 最後に画面表示
cout << os.str();
}

h12_0021.png




2018年03月23日

《その347》ios_baseクラス(2)


 メンバ関数 width

 ios_baseクラスのメンバ関数のうち、
  self関数
  unself関数
  flags関数
については、前回《346》、利用しました。

 今回のプログラムは、
  width関数を扱っています。
この関数は、出力時のフィールド幅を取得・設定します。

 標準出力ストリーム および ファイル出力ストリームについて、
その最上位基底クラス ios_base のメンバ関数 width を利用して、書式設定しています。
  cout.ios_base::width(10);
  ofstream fos("text.txt"); fos.ios_base::width(10);
出力幅が文字列の文字数より多い場合、デフォルトでは、左の余白部分がスペースで埋められ、文字列は右寄せで出力されます。

 なお、width関数は、オブジェクトcout, ofstream fos のメンバ関数でもありますから、
ios_base:: の部分は、省略可能です。


#include <fstream>
#include <string>
#include <iostream>
using namespace std;

int main() {
ofstream fos("text.txt");
if (!fos) {
cout << "ファイルをオープンできま"
"せん。\n";
exit(1);
}

char str[6];
cout << "文字列(6文字未満) : ";
cin.ios_base::width(6);
cin >> str;

fos << "※";
fos.ios_base::width(10);
fos << str << '\n';
fos << " ^^^^^^^^^^\n";

cout << "\n直接、cout で画面に出力\n";
cout << "※";
cout.ios_base::width(10);
cout << str << '\n';
cout << " ^^^^^^^^^^\n";

fos.close();
ifstream fis("text.txt");
if (!fis) {
cout << "ファイルをオープンで"
"きません。\n";
exit(1);
}

cout << "text.txt から読み込んで"
"画面出力\n";
while (1) {
string tmp;
getline(fis, tmp);
if (!fis) break;
cout << tmp << '\n';
}
}

h12_0014.png




《その346》ios_baseクラス(1)


 fmtflags型

 <ios>ヘッダが提供する ios_baseクラスは、ストリームに関するすべてのクラスの最上位基底クラスです。

 ios_baseクラスで定義されている型には、
  fmtflags型
  iostate型
  openmode型
  seekdir型
があります。

 今回のプログラムでは、これらのうち、fmtflags型について、その働きをチェックしています。
プログラムでは、fmtflags型の要素のうち、以下のものを利用します。
  showpos (非負数値に + を付加して出力)
  boolalpha (bool型を true, false で入出力)
  hex (整数を 16進表記で入出力)
  dec (整数を 10進表記で入出力)

 fmtflags型の要素は、特定のビットのみが 1 になっていて、書式制御部分の対応するビットを 1 にすることで、その効果が得られるようになっています。


 以下は、プログラムの説明です。
 プログラムは、ofstream型に関して、その最上位基底クラス ios_base で定義されている fmtflags型の働きを見るものです。

 最初に、text.txt を切捨てモードでオープンします。
  ofstream fos("text.txt");

 以下、
  setf関数
を使って、showpos, boolalpha, hex, dec の順に設定し、
  flags関数
で、書式制御部分のビットの変化を確認します。

 なお、設定の解除には、
  unsetf関数
を利用しています。

 最後に、showpos, boolalpha, hex をそれぞれセットした際に、text.txtファイルにサンプル出力したものを、確認のために画面表示しています。


#include <fstream>
#include <string>
#include <iostream>
using namespace std;

const unsigned bits = numeric_limits<unsigned int>::digits;

const char* bits_of(unsigned x) {
static char str[bits + 1];

unsigned n = bits;
for (unsigned i = 0; i < n; i++) {
if ((x >> i) & 1U) str[n - i - 1] = '1';
else str[n - i - 1] = '0';
}
str[n] = '\0';
return str;
}


int main() {
ofstream fos("text.txt");
if (!fos) {
cout << "ファイルをオープンできま"
"せん。\n";
exit(1);
}

cout << "◆最初の書式制御情報\n";
cout << bits_of(fos.flags()) << "\n\n";


cout << "◆(1)書式変更:非負数値に + を付加して出力\n";
cout << "fos.setf(ios_base::showpos);\n";
fos.setf(ios_base::showpos);
cout << bits_of(fos.flags()) << '\n';
fos << "(1)の出力例\n" << true << ", " << false << '\n';
cout << "変更を解除\n";
cout << "fos.unsetf(ios_base::showpos);\n";
fos.unsetf(ios_base::showpos);
cout << bits_of(fos.flags()) << "\n\n";


cout << "◆(2)書式変更:bool型を true, false で出力\n";
cout << "fos.setf(ios_base::boolalpha);\n";
fos.setf(ios_base::boolalpha);
cout << bits_of(fos.flags()) << '\n';
fos << "\n(2)の出力例\n" << true << ", " << false << '\n';
cout << "変更を解除\n";
cout << "fos.unsetf(ios_base::boolalpha);\n";
fos.unsetf(ios_base::boolalpha);
cout << bits_of(fos.flags()) << "\n\n";


cout << "◆(3)書式変更:整数を 16進表記で出力\n";
cout << "fos.setf(std::ios_base::hex, "
"ios_base::basefield);\n";
fos.setf(std::ios_base::hex,
ios_base::basefield);
cout << bits_of(fos.flags()) << '\n';
fos << "\n(3)の出力例\n" << 2748 << '\n';
cout << "変更を解除(10進表記に戻す)\n";
cout << "fos.setf(std::ios_base::dec, "
"ios_base::basefield);\n";
fos.setf(std::ios_base::dec,
ios_base::basefield);
cout << bits_of(fos.flags()) << "\n\n";


cout << "◆整数を 10進表記で出力 かつ\n";
cout << " 非負数値に + を付加して出力 かつ\n";
cout << " bool型を true, false で出力 の状態\n";
cout << "fos.setf(ios_base::boolalpha);\n";
cout << "fos.setf(ios_base::showpos);\n";
fos.setf(ios_base::boolalpha);
fos.setf(ios_base::showpos);
cout << bits_of(fos.flags()) << "\n\n";


fos.close();
ifstream fis("text.txt");
if (!fis) {
cout << "ファイルをオープンできま"
"せん。\n";
exit(1);
}

while (1) {
string tmp;
getline(fis, tmp);
if (!fis) break;
cout << tmp << '\n';
}
}

h12_0012.png




2018年03月22日

《その345》文字列ストリーム(2)


 前回《344》のプログラムでは、
  文字列入力ストリーム istringstream,
  文字列出力ストリーム ostringstream
を利用しました。

 下記のプログラムでは、前回と同様の処理を
  文字列入出力ストリーム stringstream
を利用して行っています。

以下は、プログラムです。

#include <sstream>
#include <string>
#include <iostream>

int main() {
std::string str = "2018/03/21";

// 文字列の入出力ストリーム ss
std::stringstream ss;

// ss に 文字列 str を出力します。
ss << str;

int y, m, d;
char c;

// ss から読み込みます。
// c で '/' を読み飛ばします。

ss >> y >> c >> m >> c >> d;

// ss を初期状態にします。
ss.clear(); ss.str("");

// ss に文字列を出力します。
for (int i = 21; i < 25; i++)
ss << y << "年" << m << "月"
<< i << "日" << '\n';

std::cout << ss.str();
}

h12_0011.png



2018年03月21日

《その344》文字列ストリーム(1)


 ストリームライブラリ

 入出力用ストリームは。入力用,入出力用,出力用の3種類に分類されます。
また、ストリームは、入出力先によって、ファイル用,文字列用の2種類に分類されます。

◆入出力先がファイル
・入力ストリーム ifstream
 typedef basic_ifstream<char> ifstream
・入出力ストリーム fstream
 typedef basic_fstream<char> fstream
・出力ストリーム ofstream
 typedef basic_ofstream<char> ofstream

◆入出力先が文字列 ※文字列ストリームについては、本ブログ《84》でも扱っています。
・入力ストリーム istringstream
 typedef basic_istringstream<char> istringstream
・入出力ストリーム stringstream
 typedef basic_stringstream<char> stringstream
・出力ストリーム ostringstream
 typedef basic_ostringstream<char> ostringstream

以下のプログラムは、文字列ストリームの利用例です。

#include <sstream>
#include <iostream>

int main() {
std::string str = "2018/03/21";

// 文字列からの入力用ストリーム is
std::istringstream is(str);

int y, m, d;
char c;

// c で '/' を読み飛ばします。
is >> y >> c >> m >> c >> d;

// 文字列への出力用ストリーム os
std::ostringstream os;

for (int i = 21; i < 25; i++)
os << y << "年" << m << "月" << i << "日" << '\n';

// osに蓄えられている文字列は、
// メンバ関数str の呼出し
// により、string型の値と
// して取得できます。

std::cout << os.str();
}

h12_0011.png




 たまに、クリック お願いします m(_ _)m

 AA にほんブログ村 IT技術ブログ C/C++へ

こうすけ:メール kousuke_cpp@outlook.jp

【1】★★C++ 記事目次★★ ← 利用可能です。
・新版明解C++入門編 / 新版明解C++中級編
・その他 C++ 関連記事

【2】★★こうすけ@C#★★
・C# の初歩的な記事


検索
<< 2018年03月 >>
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
プロフィール
こうすけさんの画像
こうすけ

 たまに、クリック お願いします m(_ _)m

 AA にほんブログ村 IT技術ブログ C/C++へ

こうすけ:メール kousuke_cpp@outlook.jp

【1】★★C++ 記事目次★★ ← 利用可能です。
・新版明解C++入門編 / 新版明解C++中級編
・その他 C++ 関連記事

【2】★★こうすけ@C#★★
・C# の初歩的な記事


×

この広告は30日以上新しい記事の更新がないブログに表示されております。