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++中,所以不要使用scanfstd::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 所示,您还可以使用 astruct来存储带有 a 的数据vector。这取决于您想对数据做什么。

结构的优点是您有一个实体,表示与所有数据一致。并且您可以重载 anoperator>>以使用更清晰的代码读取文件。

代码将如下所示:

#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 个值表示你的 lign。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

您必须将它们放在一个 char 数组中,然后使用atof here将它们转换为浮点数。我通常使用fstream库并将它们作为 char 数组读取,然后将它们转换为 float/int 等。

于 2013-07-05T08:30:04.457 回答
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 回答
0
#include <fstream>

struct MyData
{
    int x, y, z;
    double phi, eta;
};

vector<MyData> v;
ifstream fin("input.txt");
MyData d;
while(fin >> d.x >> d.y >> d.z >> d.phi >> d.eta)
{  
     v.push_back(d);
}

或者,您可以重载运算符 >> 并执行以下操作:

istream& operator >> (istream& in, MyData& d)
{
    return in >> d.x >> d.y >> d.z >> d.phi >> d.eta;
}

int main()
{
    ifstream fin ("input.txt");
    vector<MyData> v;
    v.assign(istream_iterator<MyData>(fin), istream_iterator<MyData>());
}
于 2013-07-05T08:46:08.053 回答
-1

scanf 在没有读取任何内容时返回 -1。你可以做。

while(scanf()>=0)
{

}
于 2013-07-05T09:07:00.143 回答