入出力(C++)

C++ プログラミング言語において入出力ライブラリとは、 C++標準ライブラリに含まれる、ストリームベースの入出力機能を実装したクラステンプレートとサポート関数のファミリを指します。 [1] [2]これは、C標準ライブラリのFILEベースのストリームのオブジェクト指向的な代替手段です[3] [4]

歴史

C++の作者であるBjarne Stroustrupは、1984年にCのI/Oライブラリの型安全で拡張可能な代替として、ストリームI/Oライブラリの最初のバージョンを作成しました[5]このライブラリは、この初期バージョン以降、書式設定を制御するマニピュレータの導入や、以外の文字タイプで使用できるようにテンプレート化など、多くの機能強化が行われていますchar

1998年の標準化により、ライブラリはstd名前空間に移動され、メインヘッダーが から に変更されました<iostream.h><iostream>この記事の残りの部分では、この標準化されたバージョンについて説明します。

C++20では、ヘッダー<format>が追加され、クラスstd::format()std::formatterクラスが追加された。[6] C++23では、ヘッダー<print>が追加され、およびが追加されstd::print()std::println()任意の出力またはファイルストリームにフォーマットされた印刷が可能になった。[7]これらは両方ともVictor Zverovichによる既存のfmtlibに基づいていた[8]

概要

ライブラリ内のクラスのほとんどは、実際には非常に汎用化されたクラステンプレートです。各テンプレートは様々な文字種を操作でき、2つの文字の等価性の比較方法など、操作自体もカスタマイズ可能です。しかし、ほとんどのコードでは、1つか2つの文字種のみを使用して入出力操作を行う必要があるため、多くの場合、機能へのアクセスには複数のtypedefが用いられます。typedef は、テンプレートと文字種のよく使用される組み合わせの名前を指定します。

例えば、basic_fstream<CharT, Traits>はファイルストリームに対する入出力操作を実装する汎用クラステンプレートを指します。これは通常、fstreamのエイリアスとして使用されbasic_fstream<char,char_traits<char>>、言い換えれば、型の文字をデフォルトの文字操作セットでbasic_fstream操作します。char

ライブラリ内のクラスは、抽象クラスと実装クラスという大きく2つのカテゴリに分けられます。抽象クラスに分類されるクラスは、あらゆるタイプのストリームを扱うのに十分なインターフェースを提供します。これらのクラスを使用するコードは、データの読み取り元や書き込み先の正確な場所に依存しません。例えば、これらのコードは、再コンパイルすることなく、ファイル、メモリバッファ、またはWebソケットにデータを書き込むことができます。実装クラスは抽象クラスを継承し、具体的なデータソースまたはシンクの実装を提供します。ライブラリは、ファイルベースのストリームとメモリバッファベースのストリームのみの実装を提供します。

ライブラリ内のクラスは、低レベル操作と高レベル操作のどちらを実装しているかによって2つのグループに分けられます。低レベル操作を扱うクラスはストリームバッファと呼ばれます。これらのクラスは文字を操作しますが、フォーマット機能は提供しません。これらのクラスが直接使用されることはほとんどありません。高レベルクラスはストリームと呼ばれ、様々なフォーマット機能を提供します。これらはストリームバッファ上に構築されています。

次の表は、入出力ライブラリによって提供されるすべてのクラスをリストし、分類しています。

クラス説明型定義
ストリームバッファ(低レベル機能)
basic_streambuf具体的なデータソースやシンクに実装可能な、抽象化された低レベルの入出力インターフェースを提供します。直接使用されることはほとんどありません。
  • streambuf– 型の文字を操作しますchar
  • wstreambuf– 型の文字を操作しますwchar_t
basic_filebufファイルベースのストリーム用の低レベルの入出力インターフェースを実装します。直接使用されることはほとんどありません。
  • filebuf– 型の文字を操作しますchar
  • wfilebuf– 型の文字を操作しますwchar_t
basic_stringbuf文字列ベースのストリーム用の低レベルの入出力インターフェースを実装します。直接使用されることはほとんどありません。
  • stringbuf– 型の文字を操作しますchar
  • wstringbuf– 型の文字を操作しますwchar_t
サポートクラス
ios_base書式設定情報と例外状態を管理する
basic_iosストリームバッファを管理する
  • ios– 型の文字を操作しますchar
  • wios– 型の文字を操作しますwchar_t
入力ストリームバッファ(高レベル機能)
basic_istream抽象ストリーム バッファをラップし、フォーマット機能などの高レベルの入力インターフェイスを提供します。
  • istream– 型の文字を操作しますchar
  • wistream– 型の文字を操作しますwchar_t
basic_ifstreamファイルストリームバッファをラップする入力ストリーム。汎用入力ストリームの機能に加えて、ファイルのオープンやクローズの機能も提供します。
  • ifstream– 型の文字を操作しますchar
  • wifstream– 型の文字を操作しますwchar_t
basic_istringstream文字列ストリームバッファをラップする入力ストリーム。汎用入力ストリームの機能に加えて、基になる文字列にアクセスするための関数も提供します。
  • istringstream– 型の文字を操作しますchar
  • wistringstream– 型の文字を操作しますwchar_t
出力ストリームバッファ(高レベル機能)
basic_ostream抽象ストリーム バッファをラップし、フォーマット機能などの高レベルの出力インターフェイスを提供します。
  • ostream– 型の文字を操作しますchar
  • wostream– 型の文字を操作しますwchar_t
basic_ofstreamファイルストリームバッファをラップする出力ストリーム。汎用出力ストリームの機能に加えて、ファイルのオープンやクローズの機能も提供します。
  • ofstream– 型の文字を操作しますchar
  • wofstream– 型の文字を操作しますwchar_t
basic_ostringstream文字列ストリームバッファをラップする出力ストリーム。汎用出力ストリームの機能に加えて、基になる文字列にアクセスするための関数も提供します。
  • ostringstream– 型の文字を操作しますchar
  • wostringstream– 型の文字を操作しますwchar_t
入出力ストリームバッファ(高レベル機能)
basic_iostream抽象ストリーム バッファをラップし、フォーマット機能などの高レベルの入出力インターフェイスを提供します。
  • iostream– 型の文字を操作しますchar
  • wiostream– 型の文字を操作しますwchar_t
basic_fstreamファイルストリームバッファをラップする入出力ストリーム。汎用入出力ストリームの機能に加えて、ファイルのオープンやクローズの機能も提供します。
  • fstream– 型の文字を操作しますchar
  • wfstream– 型の文字を操作しますwchar_t
basic_stringstream文字列ストリームバッファをラップする入出力ストリーム。汎用入出力ストリームの機能に加えて、基になる文字列にアクセスするための関数も提供します。
  • stringstream– 型の文字を操作しますchar
  • wstringstream– 型の文字を操作しますwchar_t

ヘッダーファイル

入出力ライブラリのクラスは、いくつかのヘッダーに存在します。

  • <ios>書式設定情報と関連するストリーム バッファを管理するクラスstd::ios_baseとクラスの定義が含まれています。std::basic_ios
  • <istream>std::basic_istreamフォーマットされた入力を実装するクラス テンプレートの定義が含まれています。
  • <ostream>std::basic_ostreamフォーマットされた出力を実装するクラス テンプレートの定義が含まれています。
  • <iostream>std::basic_iostreamには、フォーマットされた入力と出力を実装するクラス テンプレートの定義が含まれており<ios>、、<istream>およびが含まれます<ostream>
  • <fstream>には、ファイル ストリームでフォーマットされた入力、出力、および入出力を実装する の定義とクラス テンプレートが含まれていますstd::basic_ifstreamstd::basic_ofstreamstd::basic_fstream
  • <sstream>std::basic_istringstreamには、文字列ベースのストリーム上でフォーマットされた入力、出力、および入出力を実装する の定義std::basic_ostringstreamとクラス テンプレートが含まれています。std::basic_stringstream
  • <iomanip>書式設定マニピュレータが含まれています。
  • <iosfwd>入出力ライブラリ内のすべてのクラスの前方宣言が含まれています。
  • <spanstream>は、 の改良された入出力デバイスとストリームを提供しますchar[]。これらは、std::span<CharT>基盤となるバッファへの を使用します。このヘッダーは、以前の に取って代わります<strstream>
  • <syncstream>同期された出力デバイスとストリームを提供します。
  • <format>には、 、 などのフォーマット関数とstd::format()クラス 、 などの定義、および概念が含まれていますformatterrange_formatterformattable
  • <print>には印刷関数が含まれており、これにより、書式設定された文字列を任意の出力またはファイルストリームに印刷できます。 と が含まれておりstd::print()std::println()std::println()と同じように動作しますstd::print()が、各印刷は改行文字で終了します。

<strstream>char[]入出力デバイスとストリームに使用されていました。これはstd::stringstream<spanstream>ヘッダーの使用に置き換えられ、C++26で削除されました。

ストリームバッファ

表に示すように、C++ 言語では 12 個のストリーム バッファ クラスが定義されています。

サポートクラス

ios_baseと は、basic_iosストリームの下位ビットを管理する2つのクラスです。ios_baseは、ストリームのフォーマット情報と状態を格納します。はbasic_ios、関連するストリームバッファを管理します。basic_iosは、一般的にiosまたはと呼ばれ、特定の文字型を持つwiosの2つのtypedefです。とは、プログラマが直接使用することはほとんどありません。通常、これらの機能は、それらを継承する などの他のクラスを介してアクセスされます[9] [10]basic_iosbasic_iosios_baseiostream

型定義

名前説明
ios型の文字を扱うための便利なtypedefbasic_ioschar
wiosbasic_ios型の文字を扱うための便利なtypedefwchar_t
streamoff内部業務をサポートします。
streamposバッファ ポインタまたはファイル ポインタの現在の位置を保持します。
wstreamposバッファ ポインタまたはファイル ポインタの現在の位置を保持します。
streamsizeストリームのサイズを指定します。

書式設定マニピュレータ

名前説明
boolalpha/noboolalpha型の変数がストリーム内でandboolとして表示されるか、 andとして表示されるかを指定します。truefalse01
skipws/noskipws入力操作で空白をスキップするかどうかを指定します
showbase/noshowbase数値の表記基数を表示するかどうかを指定します
showpoint/noshowpoint浮動小数点数の小数部がゼロの場合に小数部を表示するかどうかを指定します。
showpos/noshowpos+正の数を表示するかどうかを指定します
unitbuf/nounitbuf出力をバッファリングするかどうかを指定します
uppercase/nouppercase16進整数および浮動小数点出力で大文字を使用するかどうかを指定します。
left/ right/internal数字をどのように揃えるかを指定します
dec/ oct/hex整数を表示する表記法を指定します
fixed/ scientific/
hexfloat( C++11 ) /
defaultfloat(C++11)
浮動小数点数を表示する表記法を指定します

入出力ストリーム

C++ の 入出力ストリームは主にiostreamC++ 標準ライブラリの一部であるヘッダーファイル( I nput/ O utput Streamの略) によって定義されます。C++ とその前身であるC プログラミング言語には、ストリーミングデータの入出力に特別な構文はありません。その代わりに、これらは関数ライブラリとして組み合わされています。Cのstdio.hから継承されたヘッダーと同様に、 はC++ プログラムに基本的な入出力サービスを提供します。iostream は、オブジェクト、 を使用して、それぞれ標準ストリームinput、output、error(バッファなし)、log(バッファ付き)との間でデータを送受信します。C++標準ライブラリの一部として、これらのオブジェクトは名前空間の一部です[11]cstdioiostream cincoutcerrclogstd

オブジェクトcoutは 型でありostreamビットシフト演算子をオーバーロードして、ビット演算とはまったく関係のない演算を実行します。特に、左引数の値に評価されるため、同じ ostream オブジェクトに対して複数の演算を実行できます。これは、基本的にメソッド カスケードの異なる構文として機能し、流れるようなインターフェイスを公開します。 オブジェクトオブジェクトも 型であるため、その演算子もオーバーロードします。 オブジェクトは 型であり、右ビットシフト演算子をオーバーロードします。ビットシフト演算子の方向により、データが出力ストリームに向かって流れているように見えるか、入力ストリームから流れ出ているように見えます。 cerrclogostreamcinistream

出力フォーマット

方法

width(int x)次の出力の最小文字数
fill(char x)最小値を埋めるために幅を長くする必要がある場合に埋めるために使用される文字。
precision(int x)浮動小数点数の有効桁数を設定します

マニピュレーター

<<マニピュレータは、 or演算子を使用してストリームを変更できるオブジェクトです>>

endl「end line」: ストリームに改行を挿入し、flush を呼び出します。
hex「16 進数」: 以降の数値はすべて 16 進数で印刷されます。
dec"decimal": 16 進数をオフにします。
ends"end string": ストリームに null 文字を挿入し、flush を呼び出します。
flush出力ストリームにバッファリングされた文字を書き込むように強制する
ws入力ストリームに空白文字を「食べさせる」
showpointストリームに小数点と整数部のゼロを表示するように指示します

その他のマニピュレータについては、ヘッダーを使用して参照してくださいiomanip

批判

フォーマット操作子は最後に「リセット」する必要があります。そうしないと、プログラマーは予期せず次の出力ステートメントにその効果を適用してしまいます。

C++標準ライブラリの実装の中には、大量のデッドコードを持つものがあります。例えば、GNU libstdc++は、プログラムがロケールの影響を受ける型(日付、時刻、通貨など)を一切使用しない場合でも、ビルド時に自動的にロケール構築します。 [12]また、 GNU libstdc++を使用して静的にリンクされた「Hello, World!」プログラムは、を使用する同等のプログラムよりも桁違いに大きい実行ファイルを生成します。[13]メモリ容量が限られた環境向けに設計されたC++標準ライブラリの部分的な実装も存在します。これらの実装では、ロケールサポートなど、そのような環境のプログラムには必要のない機能が省略されている可能性があります。[14]ostream<iostream><cstdio><iostream>

命名規則

このライブラリを使用したC++23 以前の標準的な「Hello, World!」プログラムは<iostream>、次のように表現できます。

#include <iostream> std :: coutを使用します。std :: endl使用します  int main () { cout << "Hello, world!" << endl ; }       

このプログラムは、「Hello, world!」を出力し、その後に改行と標準出力ストリーム バッファのフラッシュが続きます。

ライブラリを使用する次の例では、 「 file.txt<fstream> 」というファイルを作成し、そこに「Hello, world!」というテキストとそれに続く改行を挿入します。

#include <fstream> std :: endlを使用します。std :: ostream使用します  int main () { ofstream file ( "file.txt" ); file << "Hello, world!" << endl ; }         

<print>C++23 で追加されたライブラリ (標準ライブラリ モジュールでもインポートされます)を使用するとstd、C++23 以降の標準的な「Hello, World!」プログラムは次のように表現されます。

stdをインポートします int main () { std :: println ( "Hello, world!" ); }   

参考文献

  1. ^ ISO/IEC 14882:2003 プログラミング言語 – C++. [lib.string.streams]/1
  2. ^ Stanley B. Lippman, Josee Lajoie (1999). C++ Primer (third ed.). マサチューセッツ州: Addison-Wesley. pp. 1109–1112. ISBN 0-201-82470-1
  3. ^ Bjarne Stroustrup (1997). 『C++プログラミング言語(第3版)』Addison-Wesley. pp. 637–640. ISBN 0-201-88954-4
  4. ^ Stanley B. Lippman, Josee Lajoie (1999). C++ Primer (third ed.). マサチューセッツ州: Addison-Wesley. pp. 1063–1067. ISBN 0-201-82470-1
  5. ^ ビャルネ・ストルストラップ。 「C++ の歴史: 1979 ~ 1991 年」(PDF)
  6. ^ Victor Zverovich (2019年7月16日). 「テキストフォーマット」. open-std.org . WG 21.
  7. ^ Victor Zverovich (2022年3月25日). 「フォーマットされた出力」. open-std.org . WG 21.
  8. ^ Victor Zverovich. 「{fmt} - 最新の書式設定ライブラリ」. fmt.dev . fmtlib . 2025年12月1日閲覧
  9. ^ Stanley B. Lippman, Josee Lajoie (1999). C++ Primer (third ed.). マサチューセッツ州: Addison-Wesley. pp. 1112–1120. ISBN 0-201-82470-1
  10. ^ "<ios> Visual Studio 2010". Microsoft MSDN: Visual Studio 2010 . 2011年9月28日閲覧
  11. ^ ホルツナー、スティーブン (2001)。C++: ブラックブック。アリゾナ州スコッツデール:コリオリグループ。 p. 584.ISBN 1-57610-777-9. ...endl は出力バッファをフラッシュし、改行を標準出力ストリームに送信します。
  12. ^ GNU libstdc++ ソースコード、bits/ios_base.h
  13. ^ C++ vs. C – ピン8
  14. ^ "uClibc++ C++ライブラリ" . 2012年1月6日閲覧
  • 入出力ライブラリの C++ リファレンス
  • Apache C++ 標準ライブラリ IOstreams
  • C++での出力フォーマットに関する包括的なチュートリアル
Retrieved from "https://en.wikipedia.org/w/index.php?title=Input/output_(C%2B%2B)&oldid=1325383437#Input/output_streams"