C++初心者のためのsetfill関数入門!5つの具体的な使い方をプロが解説

C++のsetfill関数を徹底解説するイメージC++
この記事は約13分で読めます。

 

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

基本的な知識があればカスタムコードを使って機能追加、目的を達成できるように作ってあります。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を凌駕する現役のプログラマチームによって監修されています。

サイト内のコードを共有する場合は、参照元として引用して下さいますと幸いです

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

C++言語のプログラミングにおいて、文字列や数値の出力は基本中の基本です。

特に、フォーマットされた出力は、見やすいコードを書く上で欠かせない要素です。

この記事では、C++でのフォーマット出力を美しく、効率的に行うためのsetfill関数について詳しく解説します。

setfill関数は、C++の標準入出力ライブラリである<iostream>に含まれる機能の一つで、出力時のパディング(埋め文字)を制御するのに使用されます。

初心者から上級者まで、この記事を通じてsetfill関数の基本から応用までを深く理解し、C++のコーディングスキルを一段と向上させることができるでしょう。

●setfill関数とは

C++におけるsetfill関数は、出力ストリームに対して埋め文字(パディング文字)を設定するために使用されます。

この関数は、指定された文字を使って出力幅を埋める際に非常に便利です。

たとえば、数値や文字列を一定のフォーマットで整列させたい場合や、見栄えを良くするために特定の文字で空白部分を埋めたい場合に利用されます。

setfill関数は、std::coutstd::ofstreamなど、様々な出力ストリームに対して適用可能です。

○setfill関数の基本概要

setfill関数の基本的な使用方法は、出力ストリームに対してsetfill操作子を適用し、その後に出力する内容を記述することです。

この操作子は、ストリームに対して一時的に作用し、一度出力操作が行われると、その効果はリセットされます。

つまり、setfill操作子を使用した出力は、その出力コマンドにのみ影響を及ぼし、次の出力には影響しません。

この振る舞いは、コードの可読性と再利用性を高める上で非常に便利です。

また、setfill関数はstd::setw関数と組み合わせて使用されることが多く、setw関数で設定した幅に対してsetfill関数で指定した文字を埋めることができます。

●setfill関数の使い方

C++におけるsetfill関数の使い方は多岐にわたります。

この関数は、主に出力を整形する際に使用され、出力の見た目を整えるのに役立ちます。

ここでは、setfill関数の基本的な使い方から、より複雑な使い方までを順を追って説明します。

○サンプルコード1:基本的な使用方法

最も基本的なsetfill関数の使い方は、出力する文字列や数値の前後に特定の文字を挿入することです。

下記のサンプルコードでは、数字の前に空白を挿入しています。

#include <iostream>
#include <iomanip>

int main() {
    std::cout << std::setw(10) << std::setfill(' ') << 123 << std::endl;
    return 0;
}

このコードでは、std::setw(10)を使用して出力幅を10文字に設定し、std::setfill(' ')で空白文字を埋め文字として指定しています。

結果として、数値123の前に7つの空白が挿入され、全体で10文字の幅になります。

このようにsetfill関数を使用することで、出力のフォーマットを整えることができます。

○サンプルコード2:フォーマットされた出力の作成

setfill関数は、フォーマットされた出力を作成する際にも有用です。

たとえば、表やレポートのような整列した出力が必要な場合に役立ちます。

下記のサンプルコードでは、複数の値を整列して出力しています。

#include <iostream>
#include <iomanip>

int main() {
    for (int i = 1; i <= 5; ++i) {
        std::cout << std::setw(10) << std::setfill('.') << i << std::endl;
    }
    return 0;
}

この例では、1から5までの数値を、それぞれ10文字の幅で出力しています。

std::setfill('.')を用いて、空白の部分をピリオドで埋めています。

これにより、数値が右寄せで、左側がピリオドで埋められた形式で出力されます。

○サンプルコード3:ループ内での使用例

setfill関数は、ループ内で使用することで、繰り返し出力を整形するのに適しています。

下記のサンプルコードでは、ループを使用して複数の値を整列させて出力しています。

#include <iostream>
#include <iomanip>

int main() {
    for (int i = 1; i <= 10; ++i) {
        std::cout << std::setw(4) << std::setfill('0') << i << std::endl;
    }
    return 0;
}

このコードでは、1から10までの数値を4文字幅で出力しています。

1桁または2桁の数値の前には、std::setfill('0')によって0が挿入され、全ての出力が4文字に統一されます。

このように、setfill関数をループ内で使うことで、一貫した形式の出力を生成することが可能です。

○サンプルコード4:条件付き出力での応用

setfill関数は、条件に応じた出力のカスタマイズにも利用できます。

例えば、ある条件を満たす場合にのみ特定のパディングを適用するといった場合です。

下記のサンプルコードでは、偶数のみ特定の文字でパディングされた出力を行っています。

#include <iostream>
#include <iomanip>

int main() {
    for (int i = 1; i <= 10; ++i) {
        if (i % 2 == 0) {
            std::cout << std::setw(4) << std::setfill('*') << i << std::endl;
        } else {
            std::cout << std::setw(4) << std::setfill(' ') << i << std::endl;
        }
    }
    return 0;
}

この例では、1から10までの数値をループで出力していますが、偶数の場合は'*'でパディングされ、奇数の場合は空白でパディングされます。

このようにsetfill関数を条件付きで使うことで、出力のカスタマイズが可能になります。

○サンプルコード5:カスタムパディングの作成

さらに応用的な使い方として、カスタムパディングの作成があります。

ここでは、異なるパディング文字を組み合わせた複雑な出力フォーマットを作成します。

下記のサンプルコードは、その一例を表しています。

#include <iostream>
#include <iomanip>

int main() {
    std::cout << std::left << std::setw(10) << std::setfill('-') << "Left";
    std::cout << std::right << std::setw(10) << std::setfill('=') << "Right" << std::endl;
    return 0;
}

このコードでは、左寄せで"Left"という文字列を'-'でパディングし、右寄せで"Right"という文字列を'='でパディングしています。

出力結果は、左側が"Left------"、右側が"=====Right"となります。

このように異なるパディング文字を用いることで、より複雑で視覚的に魅力的な出力を実現できます。

●setfill関数の応用例

setfill関数は、C++プログラミングにおける出力のカスタマイズにおいて、非常に強力なツールです。

これまでの基本的な使い方から応用的な例までを見てきましたが、さらに複雑なシナリオや、他のストリーム操作子との連携を通じて、その可能性を広げてみましょう。

○サンプルコード6:複合データタイプとの組み合わせ

setfill関数は、複合データタイプと組み合わせて使用することで、より複雑なフォーマットを実現できます。

下記のサンプルコードでは、構造体のメンバを整形して出力しています。

#include <iostream>
#include <iomanip>

struct Data {
    int id;
    std::string name;
};

int main() {
    Data data = {1, "Sample"};
    std::cout << std::left << std::setw(10) << std::setfill('-') << data.id;
    std::cout << std::right << std::setw(20) << std::setfill('.') << data.name << std::endl;
    return 0;
}

このコードでは、Data構造体のidnameメンバを、異なるパディング文字を用いて整形して出力しています。

これにより、複数の異なるデータタイプの出力を一つの整ったフォーマットで表示することができます。

○サンプルコード7:動的なパディングの実装

動的な状況に応じてsetfill関数の挙動を変更することも可能です。

下記のサンプルコードでは、条件に応じて異なるパディング文字を使う例を表しています。

#include <iostream>
#include <iomanip>

int main() {
    for (int i = 1; i <= 10; ++i) {
        char fillChar = (i % 2 == 0) ? '*' : '-';
        std::cout << std::setw(5) << std::setfill(fillChar) << i << std::endl;
    }
    return 0;
}

この例では、ループの各反復で、偶数と奇数で異なるパディング文字を用いています。

このような動的なパディングは、出力の柔軟性を高めるのに役立ちます。

○サンプルコード8:ストリーム操作子との連携

最後に、setfill関数は他のストリーム操作子と組み合わせて使用することで、より高度な出力制御が可能になります。

下記のサンプルコードでは、setfill関数をsetwsetprecisionと組み合わせています。

#include <iostream>
#include <iomanip>

int main() {
    double value = 123.456;
    std::cout << std::fixed << std::setprecision(2) << std::setw(10) << std::setfill('*') << value << std::endl;
    return 0;
}

このコードでは、浮動小数点数を固定小数点表記で2桁の精度で出力し、幅を10文字に設定しています。

不足分は'*'でパディングしています。

このように、setfill関数を他のストリーム操作子と組み合わせることで、複雑な出力フォーマットを容易に実現できます。

●注意点と対処法

setfill関数を使用する際には、いくつかの注意点があります。

これらを理解し、適切に対処することで、より効果的にsetfill関数を使用することができます。

○パディング文字の選択と影響

setfill関数で使用するパディング文字の選択は、出力の可読性に大きく影響します。

適切なパディング文字を選ぶことで、出力が目的に応じて整理され、より理解しやすくなります。

例えば、数字のリストを整列させる場合、空白文字を使用するのが一般的ですが、視覚的な強調が必要な場合は、異なる記号を使用することもできます。

パディング文字の選択は、出力のコンテキストや目的に応じて慎重に行う必要があります。

○パフォーマンスへの考慮

setfill関数は、出力を整形するための便利なツールですが、大量のデータを出力する場合、特にループ内で頻繁に使用する場合はパフォーマンスへの影響を考慮する必要があります。

各出力操作でsetfill関数を呼び出すことは、プログラムの実行速度を遅くする可能性があります。

パフォーマンスが重要なアプリケーションでは、setfill関数の使用は最小限に抑え、必要な場合のみに限定することが望ましいです。

また、ループの外で一度設定したパディングスタイルを維持することで、無駄な操作を減らすことができます。

●カスタマイズ方法

setfill関数の応用範囲は広く、様々なカスタマイズが可能です。

ここでは、setfill関数を用いたパディングスタイルのカスタマイズ方法と、複数のストリーム操作子との組み合わせについて解説します。

○パディングスタイルのカスタマイズ

setfill関数を使ったパディングスタイルのカスタマイズは、出力の見た目を調整するのに非常に有効です。

例えば、異なる種類のデータを出力する際に、それぞれ異なるパディング文字を使用することで、データの区別を明確にすることができます。

また、出力の左寄せ、中央寄せ、右寄せをstd::leftstd::center(※C++20以降)、std::rightと組み合わせて使用することで、より洗練されたフォーマットを作成することが可能です。

例えば、下記のコードでは、左寄せと右寄せの出力を異なるパディング文字で実現しています。

#include <iostream>
#include <iomanip>

int main() {
    std::cout << std::left << std::setw(10) << std::setfill('-') << "Left";
    std::cout << std::right << std::setw(10) << std::setfill('=') << "Right" << std::endl;
    return 0;
}

このコードにより、”Left”は左寄せで’-‘でパディングされ、”Right”は右寄せで’=’でパディングされます。

○複数のストリーム操作子との組み合わせ

setfill関数は、他のストリーム操作子と組み合わせて使用することで、さらに多様な出力スタイルを実現できます。

std::setwで幅を設定し、std::setprecisionで小数点以下の精度を指定することで、数値のフォーマットを細かく制御できます。

例えば、下記のコードでは、setfill関数をsetwsetprecisionと組み合わせて浮動小数点数を整形して出力しています。

#include <iostream>
#include <iomanip>

int main() {
    double num = 123.456;
    std::cout << std::fixed << std::setprecision(2) << std::setw(10) << std::setfill('*') << num << std::endl;
    return 0;
}

このコードでは、数値123.456が小数点以下2桁で固定され、全体の幅が10文字になるように設定されています。

不足分は'*'でパディングされます。

まとめ

この記事を通して、C++におけるsetfill関数の多様な使い方とその応用例について詳しく解説しました。

基本的な使用方法から始め、条件付き出力やカスタムパディングの作成、さらには複数のストリーム操作子との組み合わせによる応用例まで、幅広い内容をカバーしました。

setfill関数の理解を深めることで、C++の出力をより洗練され、読みやすいものにすることが可能です。

初心者から上級者まで、この関数の使い方をマスターすることで、C++プログラミングのスキルをさらに向上させることができるでしょう。