ダブルスのフラットコレクションが1つだけ必要な場合:
#include <vector>
#include <istream> // for operator>>
#include <fstream> // for std::ifstream
std::vector<double> v;
for (double d; inputFile >> d; ) { v.push_back(d); }
またはもっと簡単:
// includes as above
#include <iterator>
std::vector<double> v((std::istream_iterator<double>(inputFile)),
std::istream_iterator<double>());
各行にコンテナが必要な場合:
// includes as above
#include <string>
#include <sstream>
std::vector<std::vector<double>> v;
for (std::string line; std::getline(inputFile, line); )
{
std::istringstream iss(line);
v.emplace_back(std::istream_iterator<double>(iss),
std::istream_iterator<double>());
}
行ごとのアプローチでは、入力文字列の最後に正常に到達したかどうか、または無効な入力によって停止されて診断を発行したかどうかを確認することもできます。エラーチェックを極端に行いたい場合は、ストリームから個々の文字列double
を抽出し、それらを(を使用してstd::strtod
)として解析し、それが失敗した場合は、解析できないトークンをスキップして診断を発行できます。
// ...
#include <cstdlib>
for (std::string line; std::getline(inputFile, line); )
{
std::istringstream iss(line);
v.emplace_back();
for (std::string token; iss >> token; )
{
char * e;
double const d = std::strtod(token.c_str(), &e);
if (*e != '\0') { /* error! skip this token */ continue; }
v.back().emplace_back(d);
}
}