如果你只想要一个平面的双打集合:
#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);
}
}