0

ファイルを1行ずつ読み取り、スペースに基づいて解析し、inputというベクトルに配置しようとしています。ただし、行に用語の数が設定されていないため、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);

次に、ここに、input[i]に入力された行の各スペースについて言う何かがあります。

 }

私はC++を初めて使用するので、誰かが私の道を切り開くことができるように助けていただければ幸いです。

ありがとう、

ジョン

4

2 に答える 2

4

ダブルスのフラットコレクションが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);
    }
}
于 2012-07-23T21:37:09.750 に答える
2

while (inputFile.good())読み取りが失敗したにのみfalseと評価されるため、間違っています。ループ内に追加のチェックがない場合、最後の反復は無効な入力で機能します。正しい慣用的な方法は、読み取りをループの状態にすることです。

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

この方法では、getlineが成功した場合にのみループに入ります。lineこれで、読み取り内部ループ条件を使用した同様のアプローチを使用して、そこから文字列ストリームを構築し、そこからdoubleを読み取ることができます。

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