繰り返し処理

[C++] while文とcinを組み合わせて複数行入力を行う方法

C++でwhile文とcinを組み合わせて複数行入力を処理する方法は、入力が終了する条件を指定しながらループを回す手法です。

一般的には、標準入力が終了する(EOF)までデータを読み取る方法が用いられます。

例えば、while (cin >>変数)の形式で記述すると、cinが入力を受け取るたびにループが実行され、入力が終わるとループが終了します。

この方法は、行単位や単語単位での入力処理に適しています。

while文とcinを使った複数行入力の基本

C++において、while文とcinを組み合わせることで、ユーザーからの複数行の入力を簡単に処理することができます。

この方法は、特に不特定の行数のデータを受け取る際に便利です。

以下に基本的な使い方を示します。

基本的な構文

while文を使用して、特定の条件が満たされる限り、ユーザーからの入力を受け取り続けることができます。

以下はその基本的な構文です。

#include <iostream>
#include <string>
int main() {
    std::string inputLine; // 入力行を格納する変数
    std::cout << "複数行の入力をしてください(終了するには空行を入力):\n";
    // 空行が入力されるまで繰り返す
    while (true) {
        std::getline(std::cin, inputLine); // 行を読み込む
        if (inputLine.empty()) { // 空行の場合
            break; // ループを終了
        }
        std::cout << "入力された行: " << inputLine << std::endl; // 入力を表示
    }
    return 0;
}

このコードでは、ユーザーが空行を入力するまで、while文が繰り返し実行されます。

std::getlineを使用することで、空白を含む行も正しく読み取ることができます。

このプログラムを実行すると、以下のような出力が得られます。

複数行の入力をしてください(終了するには空行を入力):
こんにちは
入力された行: こんにちは
C++は楽しいです
入力された行: C++は楽しいです

このように、ユーザーが入力した内容がそのまま表示され、空行を入力することでプログラムが終了します。

while文とcinを組み合わせることで、柔軟な入力処理が可能になります。

複数行入力を処理する方法

C++で複数行の入力を処理する際には、while文とstd::getlineを組み合わせるのが一般的です。

この方法を使うことで、ユーザーからの入力を行単位で受け取ることができ、特に不特定の行数のデータを扱う場合に非常に便利です。

以下に、具体的な方法を解説します。

1. std::getlineの使用

std::getline関数を使用することで、標準入力から1行ずつデータを読み取ることができます。

この関数は、空白を含む行も正しく読み取るため、ユーザーが入力した内容をそのまま取得することが可能です。

2. ループ処理の実装

while文を使って、特定の条件が満たされる限り、入力を受け取り続けることができます。

以下のサンプルコードでは、ユーザーが空行を入力するまで、複数行の入力を受け付けます。

#include <iostream>
#include <string>
int main() {
    std::string inputLine; // 入力行を格納する変数
    std::cout << "複数行の入力をしてください(終了するには空行を入力):\n";
    // 空行が入力されるまで繰り返す
    while (true) {
        std::getline(std::cin, inputLine); // 行を読み込む
        if (inputLine.empty()) { // 空行の場合
            break; // ループを終了
        }
        // 入力された行を処理する(ここでは表示)
        std::cout << "入力された行: " << inputLine << std::endl;
    }
    return 0;
}

3. 入力の処理

上記のコードでは、ユーザーが入力した各行をそのまま表示していますが、実際のアプリケーションでは、入力されたデータを配列やリストに格納したり、特定の処理を行ったりすることが一般的です。

4. 入力の終了条件

この方法では、空行を入力することで入力を終了しますが、他の条件(例えば特定のキーワードが入力された場合など)を設定することも可能です。

これにより、より柔軟な入力処理が実現できます。

5. 注意点

  • std::getlineを使用する際は、std::cinの状態に注意が必要です。

特に、前の入力でエラーが発生している場合、std::getlineが正しく動作しないことがあります。

  • 入力の内容に応じて、適切なエラーチェックを行うことが重要です。

このように、while文とstd::getlineを組み合わせることで、C++における複数行の入力処理が簡単に実現できます。

実践例:while文とcinを使った具体的なコード

ここでは、while文とcinを使用して、ユーザーから複数行の入力を受け取り、その内容を処理する具体的なコード例を示します。

この例では、ユーザーが入力した各行をリストに格納し、最終的に全ての入力を表示するプログラムを作成します。

コード例

#include <iostream>
#include <string>
#include <vector> // ベクターを使用するために必要
int main() {
    std::string inputLine; // 入力行を格納する変数
    std::vector<std::string> inputLines; // 入力行を格納するベクター
    std::cout << "複数行の入力をしてください(終了するには空行を入力):\n";
    // 空行が入力されるまで繰り返す
    while (true) {
        std::getline(std::cin, inputLine); // 行を読み込む
        if (inputLine.empty()) { // 空行の場合
            break; // ループを終了
        }
        inputLines.push_back(inputLine); // 入力行をベクターに追加
    }
    // 入力された全ての行を表示
    std::cout << "\n入力された内容は以下の通りです:\n";
    for (const auto& line : inputLines) { // ベクターの各行を表示
        std::cout << line << std::endl;
    }
    return 0;
}
  • ヘッダーファイルのインクルード: #include <vector>を追加することで、動的配列であるstd::vectorを使用できるようにしています。
  • 入力行の格納: std::vector<std::string> inputLines;を使用して、ユーザーが入力した行を格納するためのベクターを作成しています。
  • 入力の受け取り: while文を使って、ユーザーが空行を入力するまで、std::getlineで行を読み込み、ベクターに追加しています。
  • 入力内容の表示: 最後に、ベクターに格納された全ての行をループで表示しています。

このプログラムを実行すると、以下のような出力が得られます。

複数行の入力をしてください(終了するには空行を入力):
こんにちは
お元気ですか?
C++プログラミングは楽しいです。
入力された内容は以下の通りです:
こんにちは
お元気ですか?
C++プログラミングは楽しいです。

このように、ユーザーが入力した内容を全て表示することができ、while文とcinを使った複数行入力の処理が実現できました。

この基本的な構造を応用することで、様々な入力処理が可能になります。

入力エラーとその対処法

C++でユーザーからの入力を受け取る際には、さまざまな入力エラーが発生する可能性があります。

これらのエラーを適切に処理することで、プログラムの安定性とユーザー体験を向上させることができます。

以下に、一般的な入力エラーとその対処法を解説します。

1. 空行の入力

ユーザーが意図せず空行を入力することがあります。

これに対処するためには、空行が入力された場合に特定の処理を行うようにします。

例えば、空行が入力されたらループを終了するなどの処理が考えられます。

if (inputLine.empty()) { // 空行の場合
    std::cout << "空行が入力されました。入力を終了します。\n";
    break; // ループを終了
}

2. 不正なデータ型の入力

数値を期待している場合に文字列が入力されると、プログラムがエラーを起こすことがあります。

この場合、std::cinの状態を確認し、エラーが発生した場合は再入力を促すことが重要です。

int number;
std::cout << "整数を入力してください:";
while (!(std::cin >> number)) { // 整数の入力を期待
    std::cout << "無効な入力です。整数を再度入力してください:";
    std::cin.clear(); // エラーフラグをクリア
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // バッファをクリア
}

3. 入力の長さ制限

ユーザーが非常に長い入力を行うと、メモリの問題やパフォーマンスの低下を引き起こす可能性があります。

入力の長さを制限することで、これを防ぐことができます。

const int MAX_LENGTH = 100; // 最大入力長
if (inputLine.length() > MAX_LENGTH) {
    std::cout << "入力が長すぎます。最大" << MAX_LENGTH << "文字までです。\n";
    continue; // 再入力を促す
}

4. 特定の条件に基づくエラー処理

特定の条件(例えば、特定のキーワードが必要な場合など)に基づいてエラー処理を行うことも重要です。

条件に合わない入力があった場合は、エラーメッセージを表示し、再入力を促します。

std::cout << "色を入力してください(赤、青、緑):";
std::getline(std::cin, inputLine);
if (inputLine != "赤" && inputLine != "青" && inputLine != "緑") {
    std::cout << "無効な色です。赤、青、緑のいずれかを入力してください。\n";
    continue; // 再入力を促す
}

5. エラーメッセージの表示

エラーが発生した場合は、ユーザーに対して明確なエラーメッセージを表示することが重要です。

これにより、ユーザーは何が問題であったのかを理解しやすくなります。

std::cout << "エラー: 入力が無効です。再度入力してください。\n";

このように、入力エラーを適切に処理することで、C++プログラムの信頼性を高め、ユーザーにとって使いやすいアプリケーションを作成することができます。

エラー処理はプログラムの重要な部分であり、慎重に設計することが求められます。

応用:複数行入力の高度な処理

複数行の入力を受け取る基本的な方法を理解した後は、さらに高度な処理を行うことができます。

ここでは、複数行の入力を効率的に管理し、特定の条件に基づいてデータを処理する方法を紹介します。

具体的には、入力データのフィルタリング、集計、並べ替えなどの処理を行います。

1. 入力データのフィルタリング

ユーザーからの入力を受け取った後、特定の条件に基づいてデータをフィルタリングすることができます。

例えば、特定のキーワードを含む行だけを抽出する場合のコードは以下の通りです。

#include <iostream>
#include <string>
#include <vector>
int main() {
    std::string inputLine;
    std::vector<std::string> inputLines;
    std::vector<std::string> filteredLines; // フィルタリングされた行を格納
    std::cout << "複数行の入力をしてください(終了するには空行を入力):\n";
    while (true) {
        std::getline(std::cin, inputLine);
        if (inputLine.empty()) {
            break;
        }
        inputLines.push_back(inputLine); // 入力行を追加
    }
    // "特定のキーワード"を含む行をフィルタリング
    for (const auto& line : inputLines) {
        if (line.find("特定のキーワード") != std::string::npos) {
            filteredLines.push_back(line); // フィルタリングされた行を追加
        }
    }
    // フィルタリングされた行を表示
    std::cout << "\nフィルタリングされた内容は以下の通りです:\n";
    for (const auto& line : filteredLines) {
        std::cout << line << std::endl;
    }
    return 0;
}

2. 入力データの集計

複数行の入力から特定の情報を集計することも可能です。

例えば、数値の入力を受け取り、その合計を計算する場合のコードは以下の通りです。

#include <iostream>
#include <string>
#include <vector>
#include <sstream> // 文字列ストリームを使用するために必要
int main() {
    std::string inputLine;
    std::vector<int> numbers; // 数値を格納するベクター
    int sum = 0; // 合計を初期化
    std::cout << "数値を複数行で入力してください(終了するには空行を入力):\n";
    while (true) {
        std::getline(std::cin, inputLine);
        if (inputLine.empty()) {
            break;
        }
        std::istringstream iss(inputLine); // 文字列ストリームを作成
        int number;
        while (iss >> number) { // 数値を読み込む
            numbers.push_back(number); // ベクターに追加
            sum += number; // 合計を計算
        }
    }
    // 合計を表示
    std::cout << "\n入力された数値の合計は: " << sum << std::endl;
    return 0;
}

3. 入力データの並べ替え

入力されたデータを並べ替えることも可能です。

以下の例では、ユーザーからの文字列入力をアルファベット順に並べ替えます。

#include <iostream>
#include <string>
#include <vector>
#include <algorithm> // std::sortを使用するために必要
int main() {
    std::string inputLine;
    std::vector<std::string> inputLines;
    std::cout << "複数行の入力をしてください(終了するには空行を入力):\n";
    while (true) {
        std::getline(std::cin, inputLine);
        if (inputLine.empty()) {
            break;
        }
        inputLines.push_back(inputLine); // 入力行を追加
    }
    // アルファベット順に並べ替え
    std::sort(inputLines.begin(), inputLines.end());
    // 並べ替えた結果を表示
    std::cout << "\n並べ替えた内容は以下の通りです:\n";
    for (const auto& line : inputLines) {
        std::cout << line << std::endl;
    }
    return 0;
}

4. 複数行入力の保存と読み込み

入力データをファイルに保存し、後で読み込むこともできます。

これにより、ユーザーが入力したデータを永続的に保存することが可能です。

以下は、ファイルに書き込む例です。

#include <iostream>
#include <fstream> // ファイル入出力を使用するために必要
#include <string>
int main() {
    std::string inputLine;
    std::ofstream outFile("input.txt"); // ファイルを開く
    std::cout << "複数行の入力をしてください(終了するには空行を入力):\n";
    while (true) {
        std::getline(std::cin, inputLine);
        if (inputLine.empty()) {
            break;
        }
        outFile << inputLine << std::endl; // ファイルに書き込む
    }
    outFile.close(); // ファイルを閉じる
    std::cout << "入力内容がファイルに保存されました。\n";
    return 0;
}

これらの高度な処理を組み合わせることで、複数行の入力をより効果的に管理し、ユーザーのニーズに応じた柔軟なプログラムを作成することができます。

フィルタリング、集計、並べ替え、保存などの機能を実装することで、C++プログラムの実用性を大幅に向上させることができます。

まとめ

この記事では、C++におけるwhile文とcinを使用した複数行入力の基本から応用までを詳しく解説しました。

具体的には、入力の受け取り方、エラー処理、データのフィルタリングや集計、並べ替え、さらにはファイルへの保存方法について触れました。

これらの知識を活用して、実際のプログラムに応じた柔軟な入力処理を実装してみてください。

新たな機能を追加することで、より使いやすいアプリケーションを作成することができるでしょう。

関連記事

Back to top button