从文本文件C ++中读取

时间:2011-09-01 22:50:55

标签: c++

我有一个包含三列数字的文本文件;每列一列用于一堆点的x,y,z坐标。所有数字都在01之间。

我创建了以下结构:

typedef struct 
{
    double xcd, ycd, zcd;
} point; 

我想创建一个类型为point的size-N结构数组。然后我想逐行扫描文本文件,对于n粒子,我想将n行中的三个数字放入相应的xcd,{{ 1}}和ycd位置。

告诉我是否有一些有效的方法来解决这个问题。

4 个答案:

答案 0 :(得分:6)

使用ifstreamvector和其他各种配件,就像之前显示的那样已经显示了五千亿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);
}