ユーザーの入力から直接データを読み取るプログラムをコーディングしているのですが、標準入力からEOFまでのすべてのデータを(ループを使わずに)読み取るにはどうしたらよいかと考えていました。私はcin.get( input, '0' )
を使うことを考えていましたが、'0'
は実際にはEOF文字ではなく、EOFまたは'0'
のどちらか早い方まで読むだけです。
それとも、ループを使うしかないのでしょうか?もしそうなら、どのような方法があるのでしょうか?
標準入力から可変量のデータを読み取るには、ループを使うしかありません。私はいつも、std::getline()
関数が非常によく機能することを発見しました。
std::string line;
while (std::getline(std::cin, line))
{
std::cout << line << std::endl;
}
デフォルトでは getline() は改行があるまで読み込みます。別の終了文字を指定することもできますが、EOFはそれ自体が文字ではないので、単純にgetline()を1回呼び出すことはできません。
ストリームのイテレータを使えば、明示的なループがなくてもできます。 内部で何らかのループを使っているのではないかと思います。
#include <string>
#include <iostream>
#include <istream>
#include <ostream>
#include <iterator>
int main()
{
// don't skip the whitespace while reading
std::cin >> std::noskipws;
// use stream iterators to copy the stream to a string
std::istream_iterator<char> it(std::cin);
std::istream_iterator<char> end;
std::string results(it, end);
std::cout << results;
}
行全体を取得するには、std::istream::getline()(あるいは、std::stringで動作するバージョンが望ましい)関数を使用します。 どちらも、デリミタ(行末の文字)を指定できるバージョンがあります。 文字列バージョンのデフォルトは '\n' です。