0

我正在尝试逐行读取文件,根据空格对其进行解析并将其放入称为输入的向量中。但是,我不能做 cin >> x1 >> x2 >> x3 ... 因为该行没有固定数量的术语。以下是我的想法,但它可能是错误的。

vector <double> input;
fstream inputFile("../Sphere.in", fstream::in);
inputFile.open("../Sphere.in", fstream::in);

while (inputFile.good())
{
    getline(inputFile, line);

然后这里的一些东西说明输入输入[i]中的每个空格

 }

我是 C++ 的新手,如果有人能给我提供任何帮助,我将不胜感激。

谢谢,

约翰

4

2 回答 2

4

如果你只想要一个平面的双打集合:

#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);
    }
}
于 2012-07-23T21:37:09.750 回答
2

while (inputFile.good())是错误的,因为它仅在读取失败评估为假。如果没有在循环内进行额外检查,最后一次迭代将处理无效输入。正确的惯用方法是将读取放入循环的条件:

while (getline(inputFile, line)) { ... }

这样你只有在 getline 成功时才进入循环。line现在,您可以使用带有 read inside loop 条件的类似方法从那里构造一个字符串流并从中读取双精度:

while (getline(inputFile, line)) {
    istringstream iss(line);
    double d;
    while (iss >> d) input.push_back(d);
}
于 2012-07-23T21:39:33.803 回答