1

私のテキストファイルは次のようになります。

1 41 -1 -1.492 -2.9555
1 42 -1 -1.49515 -2.9745
1 43 -1 -1.49799 -2.99361
1 44 -1 -1.50051 -3.01283
1 45 -1 -1.5027 -3.03213
1 46 -1 -1.50416 -3.05301
1 47 -1 -1.50556 -3.07248

(数字はタブではなくスペースで区切ります。)

これらの値を読み取ってベクトルに入れるプログラムを C++ で書きたいのですが、どうすればよいでしょうか?

私はこれを試しました:

while(!file.eof()){
    scanf("%d %d %d %f %f", &x, &y, &z, &eta, &phi);
}

しかし、うまくいきません。

誰かが私にこれを解決する理由と方法を教えてもらえますか?

4

5 に答える 5

2

あなたはC++scanfを使用しているので、std::ifstream代わりに を使用しないでください。

#include <fstream>
using namespace std;

ifstream file("input.txt");
int x, y, z;
float eta, phi;
// Read you file until the end
while( file >> x >> y >> z >> eta >> phi )
{  
     // Print the values
     cout << "x : " << x << " y :" << y << " z : " << z << " eta : " << eta << " phi : " << phi << endl;
}

Armen Tsirunyan が示したように、 を使用しstructて でデータを保存することもできますvector。それは、データで何をしたいかによって異なります。

構造の利点は、すべてのデータを含む線を表すエンティティがあることです。また、 をオーバーロードしoperator>>て、よりクリーンなコードでファイルを読み取ることができます。

コードは次のようになります。

#include <fstream>
#include <vector>
using namespace std;

struct s_Data
{
    int x, y, z;
    float eta, phi;
};

istream& operator >> (istream& iIn, s_Data& iData)
{
    return iIn >> iData.x >> iData.y >> iData.z >> iData.eta >> iData.phi;
}

ifstream file("input.txt");
// Read you file until the end
s_Data data;
vector<s_Data> datas;
while( file >> data )
{
     // Print the values
     cout << "x : " << data.x << " y :" << data.y << " z : " << data.z << " eta : " << data.eta << " phi : " << data.phi << endl;

     // Store the values
     datas.push_back( data );
}

ここでs_Dataは、必要な 5 つの値で線を表します。はvector<s_Data>、ファイルで読み取られたすべての値を表します。次のようにして読むことができます:

unsigned int size = datas.size();
for ( unsigned int i = 0; i < size; i++ )
    cout << datas[i].x;  // read all the x values for example
于 2013-07-05T09:23:17.967 に答える
0

これにより、ファイル内の行と同じ数のベクトルを使用できます。それに興味がない場合は、単純なstd::vector<double>ものを使用して、値をプッシュバックすることができますstd::copy

#include <vector>
#include <algorithm>
#include <iterator>
#include <fstream>
#include <iostream>
#include <string>

std::ifstream file("file.txt");
std::istream &is = file; // thanks to polymorphism
std::string str;
std::vector<std::vector<double> > vects;
while ( str = getline(is) )
{
    std::vector<double> tmpVect;
    std::copy (std::istream_iterator<std::string>(is), 
               std::istream_iterator<std::string>(),
               std::back_inserter(tmpVect));
    vects.push_back(tmpVect); 
}

これstd::copyは行全体を通過し、行push_backから取得したばかりの値で一時的なベクトルを呼び出します。

編集: あなたのコメントを読んだ後、これは実際にはあなたが求めているものではないと思いますが、他の状況で役立つ可能性があります. 元の投稿を編集して、より明確にしてください。

于 2013-07-05T08:42:40.557 に答える