我的文本文件如下所示:
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);
}
但它不起作用。
有人可以告诉我为什么以及如何解决这个问题?
答案 0 :(得分: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
。这取决于您想要对数据做什么。
结构的优点是你有一个实体代表一个包含所有数据的lign。您可以重载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
代表您的lign,包含您想要的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
答案 1 :(得分:0)
您必须将它们放在char数组中,然后使用atof
here将它们转换为float。我通常使用fstream
库,我将它们作为char数组读取,然后将它们转换为float / int等。
答案 2 :(得分: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
,并使用刚刚从该行抓取的值。
编辑: 阅读你的评论后,我相信这实际上不是你要求的,但在其他情况下它可能会有所帮助。请编辑您的原始帖子以便更清楚。
答案 3 :(得分: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);
}
或者,您可以重载运算符&gt;&gt;并这样做:
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>());
}
答案 4 :(得分:-1)
当没有读取任何内容时,scanf返回-1。你可以做到。
while(scanf()>=0)
{
}