我有一个包含三列数字的文本文件;每列一列用于一堆点的x,y,z
坐标。所有数字都在0
和1
之间。
我创建了以下结构:
typedef struct
{
double xcd, ycd, zcd;
} point;
我想创建一个类型为point
的size-N结构数组。然后我想逐行扫描文本文件,对于n
粒子,我想将n
行中的三个数字放入相应的xcd
,{{ 1}}和ycd
位置。
告诉我是否有一些有效的方法来解决这个问题。
答案 0 :(得分:6)
使用ifstream
,vector
和其他各种配件,就像之前显示的那样已经显示了五千亿kajillion。
ifstream infile("myfile.txt");
// check if file opened successfully
if (!infile) {
cerr << "failure, can't open file" << endl;
cin.get();
return EXIT_FAILURE;
}
// the container in which we will store all the points
vector<point> points;
// a temporary point to hold the three coords in while we read them all
point tmp;
// read in three doubles from infile into the three coords in tmp
while (infile >> tmp.xcd && infile >> tmp.ycd && infile >> tmp.zcd)
// add a copy of tmp to points
points.push_back(tmp);
这将读取三个双打并将它们放在point
中,然后将point
的副本放在points
中。但是,如果文件模数3中的数字不是0,它将停止并且不会将不完整的点添加到points
。
答案 1 :(得分:1)
使用std::fstream
。
如果您确定该文件是正确的:
struct Point {
double xcd, ycd, zcd;
};
// btw this is how you should declare a structure in C++,
// the way you shown is rather characteristic to C and only used there
Point tab[N];
void foo() {
std::ifstream f("file.txt");
for (int i=0; i<N; ++i) {
f >> tab[i].xcd >> tab[i].ycd >> tab[i].zcd;
}
}
如果您不确定该文件是否存在且包含此数量的粒子,则应在每次尝试读取后检查f.fail()
。
答案 2 :(得分:1)
我更喜欢使用标准通用算法来编写自己的循环:
#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
#include <fstream>
typedef struct
{
double xcd, ycd, zcd;
} point;
std::istream& operator>>(std::istream&is, point& pt)
{
return is >> pt.xcd >> pt.ycd >> pt.zcd;
}
int main(int ac, char **av) {
std::ifstream f("file.txt");
std::vector<point> v;
std::copy(
std::istream_iterator<point>(f),
std::istream_iterator<point>(),
std::back_inserter(v));
}
答案 3 :(得分:1)
另一种设计是在点结构中重载流提取操作符:
struct Point
{
double x;
double y;
double z;
friend istream& operator>>(istream& inp, Point& p);
}
istream& operator>>(istream& inp, Point& p)
{
inp >> x;
inp >> y;
inp >> z;
inp.ignore(100000, '\n');
return inp;
}
用法:
ifstream myfile("data.txt");
Point p;
vector<Point> point_container;
while (myfile >> p)
{
point_container.push_back(p);
}