4

うわー、今日はあちこちで質問をしてきました。重複しているように見える場合はお詫びしますが、すべての質問には別の質問があります.1つのことがうまくいかないので.. ....等。

とにかく、私はテキストファイルを持っています:

6
3.0 2.5 -1.5 0.0 1.7 4.0
6 10

6 は、2 行目の「floats」の数 (3.0、2.5 など) です。3.0、2.5、-1.5 はすべて一連の float です。6 と 10 はちょうど 2 つの整数です。

私はベクトルを持っています

std::vector<double> numbers;

私がする必要があるのは、2行目を数字に入れることだけです。だから今私は持っている

ifstream myfile (filename.c_str());

myfile>> を実行して最初の値 (6) を取得するだけで済みますが、ベクトルに 2 行目を挿入するにはどうすればよいでしょうか? 最初の行 (この場合は 6) を読むことによって、2 行目がどれだけ大きいかを知っているだけであることを思い出してください。

また、最後の 2 つの数値はこのベクトルにあるとは想定されていませんが、2 つの個別の値です。myfile >> a >> b を実行できます。

何度も質問してすみません。しかし、私は文字通りあらゆる場所を探し、おそらく間違った質問をしてきました。

4

4 に答える 4

5
myfile >> numElements;
numbers.resize(numElements);
for (int i = 0; i < numElements; i++) {
    myfile >> numbers[i];
}
myfile >> a >> b;
于 2010-11-29T23:00:31.947 に答える
1

あなたはcopy_n()あなたの兵器庫にいますか?

template<class In, class Size, class Out>
Out copy_n(In first, Size n, Out result)
{
    while( n-- ) *result++ = *first++;
    return result;
}

他の翻訳ユニットに簡単に#includeできる場所に配置してください。便利です。このように使用して、n浮動小数点値をコピーします。

copy_n(std::istream_iterator<double>(std::cin),
       n,
       std::back_inserter(v));
于 2010-11-30T00:03:15.190 に答える
1

ファイルから行を既に読み取ったところから始めます。それで問題ないようです。これが最も基本的なアプローチです。以下の私のコードは、これがどのように機能するかを理解するために使用できる非常に単純なコードを使用して、このアプローチを示しています。

  1. 解析したい行を に取得します。stringこれはline以下のコードにあります。
  2. トークンを検索しstringます。各トークンは、数字、10 進数、または負号以外の記号で区切られています。
  3. トークンごとに、doubleを使用して文字列を に変換しますstringstream
  4. 変換された double をベクトルに追加します

ループの最後で、ベクトルを画面にダンプして検査します。

#include <string>
#include <vector>
#include <sstream>
#include <iostream>
#include <iterator>
using namespace std;

int main()
{
    string line = "3.0 2.5 -1.5 0.0 1.7 4.0";
    vector<double> doubles;

    string::size_type n_begin = 0;
    string::size_type n_end = line.find_first_not_of("-.0123456789", n_begin);
    while( n_begin != string::npos )
    {
        string cur_token = line.substr(n_begin, n_end-n_begin);
        stringstream ss;
        ss << cur_token;
        double cur_val = 0.0;
        ss >> cur_val;
        doubles.push_back(cur_val);
        // set up the next loop
        if( n_end == string::npos )
            n_begin = n_end = string::npos;
        else
        {
            n_begin = n_end + 1;
            n_end = line.find_first_not_of("-.0123456789", n_begin);
        }
    }

    copy(doubles.begin(), doubles.end(), ostream_iterator<double>(cout, "\n"));
}
于 2010-11-29T23:16:49.523 に答える
1

何かのようなもの :

int count, a, b;
double tmp;
std::vector<double> numbers;
ifstream myfile (filename.c_str());
myfile >> count;
for(int i = 0; i < count; ++i) {
    myfile >> tmp; numbers.push_back(tmp);
}
myfile >> a >> b;
于 2010-11-29T23:04:30.760 に答える