C++ で setw マニピュレーターを利用する

胡金庫 2023年10月12日
C++ で setw マニピュレーターを利用する

この記事は、C++ で setw ストリームマニピュレータを利用する方法を示しています。

C++ で std::setw 関数を使用して次の I / O 操作の幅を変更する

ストリームマニピュレータは、入出力フォーマットを変更し、場合によっては何らかのアクションを生成する特別なオブジェクトです。std::endl 関数は、おそらく出力ストリームで使用される最も一般的なオブジェクトであり、実際にはストリームマニピュレータです。改行文字を出力し、出力バッファをフラッシュします。

一方、std::setw コマンドは出力を生成しません。代わりに、次の I / O の幅を渡された整数引数に設定します。一部のストリームマニピュレータは引数を使用します。これらには、<iomanip> ヘッダーを含める必要があります。次の例は、setw マニピュレータの基本的な出力フォーマットシナリオを示しています。setfill マニピュレータは、setw の自然なコンパニオンです。前者は、指定された char 引数を使用して塗りつぶし文字を変更する場合に役立ちます。

#include <iomanip>
#include <iostream>
#include <sstream>

using std::cout;
using std::endl;
using std::setw;
using std::string;

int main() {
  cout << "setw() : |" << 11 << "|" << endl
       << "setw(4): |" << setw(4) << 11 << "|" << endl
       << "setw(4): |" << 22 << setw(4) << std::setfill('-') << 22 << 33 << "|"
       << endl;

  return EXIT_SUCCESS;
}

出力:

setw() : |11|
setw(4): |  11|
setw(4): |22--2233|

または、setw マニピュレータを使用して、stringstream オブジェクトから抽出される文字数を制限することもできます。このメソッドは、固定配列として宣言されている char バッファーに役立つ場合があります。一般に、マニピュレータは関数のオーバーロードを使用して実装されます。

各マニピュレータは、ストリームへの参照を返す関数です。これらの関数の 1つへのポインターは、ストリーム抽出/挿入演算子に渡されます。ストリーム抽出/挿入演算子は、それ自体がオーバーロードされた演算子です。引数関数は、オーバーロードされた演算子の本体から呼び出されます。

#include <iomanip>
#include <iostream>
#include <sstream>

using std::cout;
using std::endl;
using std::setw;
using std::string;

int main() {
  std::stringstream ss1("hello there");
  char arr[10];

  ss1 >> setw(6) >> arr;
  cout << arr;

  return EXIT_SUCCESS;
}

出力:

hello

setw マニピュレータの便利な機能の 1つは、固定サイズのバッファに保存する必要のあるユーザー入力の制限を簡単に設定できることです。setw への引数として sizeof(buffer) を渡す必要があります。setw 呼び出しは単一の I / O 操作に影響し、デフォルトの幅が自動的に復元されることに注意してください。逆に、setfill の変更は、明示的な変更が行われるまでアクティブのままです。

#include <iomanip>
#include <iostream>

using std::cin;
using std::cout;
using std::endl;
using std::setw;

int main() {
  char buffer[24];
  cout << "username: ";
  cin >> setw(sizeof(buffer)) >> buffer;

  return EXIT_SUCCESS;
}

出力:

username:
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook