C++ の基本的な入力と出力
C++ の基本的な入力と出力
C++ 標準ライブラリは、入出力関数の豊富なセットを提供します。これについては、後続の章で紹介します。この章では、C++ プログラミングにおける最も基本的で一般的な I/O 操作について説明します。
C++ I/O は、バイトのシーケンスであるストリームで発生します。バイト ストリームがデバイス (キーボード、ディスク ドライブ、ネットワーク接続など) からメモリに流れている場合、それは入力操作と呼ばれます。バイト ストリームがメモリからデバイス (ディスプレイ画面、プリンター、ディスク ドライブ、ネットワーク接続など) に流れている場合、これは 出力操作 と呼ばれます。
I/O ライブラリ ヘッダー ファイル
次のヘッダー ファイルは、C++ プログラミングで重要です。
ヘッドファイル | 機能と説明 |
---|---|
<iostream> | このファイルは、 標準入力ストリーム、標準出力ストリーム、バッファなしの標準エラー ストリーム、およびバッファ付きの標準エラー ストリームにそれぞれ対応するcin、cout、cerr 、および clogオブジェクトを定義します。 |
<iomanip> | このファイルは、いわゆるパラメータ化されたストリーム マニピュレータ ( setw や setprecisionなど) を介して標準化された I/O を実行するのに役立つサービスを宣言します。 |
<fストリーム> | このファイルは、ユーザー制御のファイル処理宣言に使用されます。詳細については、ファイルとストリームに関する関連する章で説明します。 |
標準出力ストリーム (cout)
定義済みオブジェクト cout は、 ostreamクラス のインスタンス です 。cout オブジェクトは、標準出力デバイス (通常はディスプレイ) に「接続」します。cout は、次のようにストリーム挿入演算子 << と組み合わせて使用されます。
#include <iostream>
using namespace std;
int main( ){
char str[] = "Hello C++";
cout << "Value of str is : " << str << endl;
}
上記のコードをコンパイルして実行すると、次の結果が生成されます。
str の値: Hello C++
C++ コンパイラは、適切なストリーム挿入演算子を選択して、出力される変数のデータ型に基づいて値を表示します。<< 演算子は、組み込み型 (integer、float、double、string、および pointer) のデータ項目を出力するためにオーバーロードされます。
ストリーム挿入演算子 << は、上記の例に示すように、ステートメント内で複数回使用できます。endl は、行末に改行を追加するために使用されます。
標準入力ストリーム (cin)
定義済みオブジェクト cin は、 istreamクラス のインスタンス です 。cin オブジェクトは標準入力デバイス (通常はキーボード) に接続されます。cin は、 次のようにストリーム抽出演算子 >> と組み合わせて使用されます。
#include <iostream>
using namespace std;
int main(){
char name[50];
cout << "请输入您的名称: ";
cin >> name;
cout << "您的名称是: " << name << endl;
}
上記のコードをコンパイルして実行すると、ユーザーに名前の入力を求めるプロンプトが表示されます。ユーザーが値を入力して Enter キーを押すと、次の結果が表示されます。
あなたの名前を入力してください: cplusplusあなたの 名前は: cplusplus
入力値のデータ型に応じて、C++ コンパイラは適切なストリーム抽出演算子を選択して値を抽出し、指定された変数に格納します。
ストリーム抽出演算子 >> は、1 つのステートメントで複数回使用できます。複数のデータを入力する必要がある場合は、次のステートメントを使用できます。
cin >> name >> age;
これは、次の 2 つのステートメントと同等です。
cin >> name;
cin >> age;
標準エラーストリーム (cerr)
定義済みオブジェクト cerr は、 ostreamクラス のインスタンス です 。cerr オブジェクトは、通常はディスプレイでもある標準エラー デバイスに接続されますが、 cerr オブジェクトはバッファリングされず、cerr に挿入された各ストリームはすぐに出力されます。
cerr は、 次のようにストリーム挿入演算子 << と組み合わせて使用することもできます。
#include <iostream>
using namespace std;
int main(){
char str[] = "Unable to read....";
cerr << "Error message : " << str << endl;
}
上記のコードをコンパイルして実行すると、次の結果が生成されます。
エラー メッセージ: 読み取れません....
標準ログ ストリーム (詰まり)
定義済みオブジェクト clog は、 ostreamクラス のインスタンス です 。clog オブジェクトは、通常はディスプレイでもある標準エラー デバイスにアタッチされますが、 clog オブジェクトはバッファリングされます。これは、clog に挿入された各ストリームが最初にバッファに格納され、バッファがいっぱいになるかバッファがフラッシュされるまで出力されないことを意味します。
clog は、 次のようにストリーム挿入演算子 << と組み合わせて使用することもできます。
#include <iostream>
using namespace std;
int main(){
char str[] = "Unable to read....";
clog << "Error message : " << str << endl;
}
上記のコードをコンパイルして実行すると、次の結果が生成されます。
エラー メッセージ: 読み取れません....
これらの小さな例では、cout、cerr、および clog の違いはわかりませんが、大きなプログラムを作成して実行すると、それらの違いが非常に明白になります。そのため、優れたプログラミング手法では、エラー メッセージには cerr ストリームを使用し、他のログ メッセージには clog ストリームを使用するように指示されています。
C++ データ構造
C++ データ構造
C/C++ 配列を使用すると、同じ型のデータ項目を格納できる変数を定義できますが、構造体は、C++ で使用できる別のユーザー定義データ型であり、異なる型のデータ項目を格納できます。
レコードを表すために構造が使用されます。図書館での本の活動を追跡するとします。各本の次のプロパティを追跡する必要がある場合があります。
- タイトル
- 著者
- 主題
- ブック ID
構造を定義する
構造体を定義するには、 struct ステートメントを使用する必要があります。構造体ステートメントは、複数のメンバーを含む新しいデータ型を定義します。構造体ステートメントの形式は次のとおりです:
struct [structure tag]{
member definition;
member definition;
...
member definition;
}[one or more structure variables];
構造タグは オプションであり、各メンバー定義は、int i; や float f; などの標準変数定義、またはその他の有効な変数定義です。構造体定義の最後で、最後のセミコロンの前に、1 つ以上の構造体変数を指定できます。これはオプションです。Book 構造体の宣言方法は次のとおりです。
struct Books{
char title[50];
char author[50];
char subject[100];
int book_id;
}book;
構造体メンバーへのアクセス
構造体のメンバーにアクセスするには、メンバー アクセス演算子 (.)を使用します。メンバー アクセス演算子は、構造体変数名とアクセスしたい構造体メンバーの間のピリオドです。struct キーワードを使用して、struct 型の変数を定義できます 。次の例は、構造体の使用法を示しています。
#include <iostream>
#include <cstring>
using namespace std;
struct Books{
char title[50];
char author[50];
char subject[100];
int book_id;
};
int main(){
struct Books Book1; // 声明 Book1,类型为 Book
struct Books Book2; // 声明 Book2,类型为 Book
// Book1 详述
strcpy( Book1.title, "Learn C++ Programming");
strcpy( Book1.author, "Chand Miyan");
strcpy( Book1.subject, "C++ Programming");
Book1.book_id = 6495407;
// Book2 详述
strcpy( Book2.title, "Telecom Billing");
strcpy( Book2.author, "Yakit Singha");
strcpy( Book2.subject, "Telecom");
Book2.book_id = 6495700;
// 输出 Book1 信息
cout << "Book 1 title : " << Book1.title <<endl;
cout << "Book 1 author : " << Book1.author <<endl;
cout << "Book 1 subject : " << Book1.subject <<endl;
cout << "Book 1 id : " << Book1.book_id <<endl;
// 输出 Book2 信息
cout << "Book 2 title : " << Book2.title <<endl;
cout << "Book 2 author : " << Book2.author <<endl;
cout << "Book 2 subject : " << Book2.subject <<endl;
cout << "Book 2 id : " << Book2.book_id <<endl;
return 0;
}
上記のコードをコンパイルして実行すると、次の結果が生成されます。
Book 1 title : Learn C++ Programming Book 1 author : Chand Miyan Book 1 subject : C++ Programming Book 1 id : 6495407 Book 2 title : Telecom Billing Book 2 author : Yakit Singha Book 2 subject : Telecom Book 2 id : 6495700
関数引数としての構造体
構造体を関数パラメーターとして使用できます。パラメーターを渡す方法は、他の型の変数またはポインターと同様です。上記の例を使用して、構造変数にアクセスできます。
#include <iostream>
#include <cstring>
using namespace std;
void printBook( struct Books book );
struct Books{
char title[50];
char author[50];
char subject[100];
int book_id;
};
int main(){
struct Books Book1; // 声明 Book1,类型为 Book
struct Books Book2; // 声明 Book2,类型为 Book
// Book1 详述
strcpy( Book1.title, "Learn C++ Programming");
strcpy( Book1.author, "Chand Miyan");
strcpy( Book1.subject, "C++ Programming");
Book1.book_id = 6495407;
// Book2 详述
strcpy( Book2.title, "Telecom Billing");
strcpy( Book2.author, "Yakit Singha");
strcpy( Book2.subject, "Telecom");
Book2.book_id = 6495700;
// 输出 Book1 信息
printBook( Book1 );
// 输出 Book2 信息
printBook( Book2 );
return 0;
}
void printBook( struct Books book ){
cout << "Book title : " << book.title <<endl;
cout << "Book author : " << book.author <<endl;
cout << "Book subject : " << book.subject <<endl;
cout << "Book id : " << book.book_id <<endl;
}
上記のコードをコンパイルして実行すると、次の結果が生成されます。
本のタイトル : C++ プログラミングの学習 本の著者 : Chand Miyan 本のタイトル : C++ プログラミング 本の ID : 6495407 本のタイトル : Telecom Billing 本の著者 : Yakit Singha 本の題名 : テレコム 本の ID : 6495700
構造体へのポインタ
次のように、他の型の変数へのポインターと同様の方法で、構造体へのポインターを定義できます。
struct Books *struct_pointer;
これで、構造体変数のアドレスを上記で定義したポインター変数に格納できます。構造体変数のアドレスを見つけるには、次のように & 演算子を構造体名の前に置きます。
struct_pointer = &Book1;
構造体へのポインターを使用して構造体のメンバーにアクセスするには、次のように -> 演算子を使用する必要があります。
struct_pointer->title;
上記の例を構造体ポインターを使用して書き直してみましょう。構造体ポインターの概念を理解するのに役立ちます。
#include <iostream>
#include <cstring>
using namespace std;
void printBook( struct Books *book );
struct Books
{
char title[50];
char author[50];
char subject[100];
int book_id;
};
int main( )
{
struct Books Book1; // 声明 Book1,类型为 Book
struct Books Book2; // 声明 Book2,类型为 Book */
// Book1 详述
strcpy( Book1.title, "Learn C++ Programming");
strcpy( Book1.author, "Chand Miyan");
strcpy( Book1.subject, "C++ Programming");
Book1.book_id = 6495407;
// Book2 详述
strcpy( Book2.title, "Telecom Billing");
strcpy( Book2.author, "Yakit Singha");
strcpy( Book2.subject, "Telecom");
Book2.book_id = 6495700;
// 通过传 Book1 的地址来输出 Book1 信息
printBook( &Book1 );
// 通过传 Book2 的地址来输出 Book2 信息
printBook( &Book2 );
return 0;
}
// 该函数以结构指针作为参数
void printBook( struct Books *book )
{
cout << "Book title : " << book->title <<endl;
cout << "Book author : " << book->author <<endl;
cout << "Book subject : " << book->subject <<endl;
cout << "Book id : " << book->book_id <<endl;
}
上記のコードをコンパイルして実行すると、次の結果が生成されます。
本のタイトル : C++ プログラミングの学習 本の著者 : Chand Miyan 本のタイトル : C++ プログラミング 本の ID : 6495407 本のタイトル : Telecom Billing 本の著者 : Yakit Singha 本の題名 : テレコム 本の ID : 6495700
typedef キーワード
作成した型を「エイリアス」できる構造を定義する簡単な方法を次に示します。例えば:
typedef struct
{
char title[50];
char author[50];
char subject[100];
int book_id;
}Books;
これで、 Booksを直接使用して 、struct キーワードを使用せずにBooks型の変数 を定義できるように なりました。次に例を示します。
本 Book1、Book2;
次のようにtypedefキーワードを使用して、構造体以外の型を定義できます 。
typedef long int *pint32; pint32 x、y、z;
x、y、z はすべて long int へのポインターです。