我有一个文本文件,其中包含如下表格数据:

6.55900695241557        21.1155467550452        76.9138444071633        0.258463086828266       -0.509978952117326
6.16317799625041        21.2904678289099        81.9489765778723        0.64982496155813        1.22239329767002
6.22868289674435        21.1103020554023        84.2444654417416        -0.470608223724072      7.75676132386755
6.00468137751715        21.0293421931085        89.3910222757195        -1.02915556930388       9.01742486070105

我需要打开此文件,并对每组5个数字应用不同的功能。在每次函数调用之间都会更改一些状态。在Python中,这是我的处理方式:
def file2lists(file):
  for line in file.readlines():
    yield line.split()

foo = SomeObject()
for [a, b, c, d, e] in file2lists(someFile):
  foo.doSomethingThatChangesState(a, b, c, d, e)

bar = AnotherObject()
for [a, b, c, d, e] in file2lists(someFile):
  bar.doSomethingThatAlsoChangesState(a, b, c, d, e)

在C++中有惯用的方法吗?

更新

我忘记提及的是,我想清楚地封装从文件中读取数据的方式。该文件中有一些需要添加前缀#的注释,我需要过滤掉这些注释,而我当前的代码是文件流,字符串流和函数调用之间非常不易理解的混合。

有没有一种干净的方法可以编写类似于流的函数?

最佳答案

类似于以下内容可能对您有用(未经测试):

double a, b, c, d, e;
std::ifstream fp("file.dat");
while (fp >> a >> b >> c >> d >> e)
{
    function1(a, b, c, d, e);
    function2(a, b, c, d, e);
    myObject.function(a, b, c, d, e);
}

对于std::ifstream,您将需要<fstream>标准库。这使用bool see herefstream运算符。然后,您可以调用希望更改其状态或使用其状态或直接在循环内部更改某些状态的任何函数或对象成员。

作为一个对象的示例,该对象在调用function时状态也发生了变化(也是未经测试的):
class Object
{
    double sum;
public:
    Object(void) : sum(0.0) {}
    void function(double a, double b, double c, double d, double e)
        { sum += a + b + c + d + e; }
    void print(void) { std::cout << sum << std::endl; }
};

然后在main中,您可以执行以下操作:
#include <iostream>
#include <fstream>

int main(void)
{
    Object myObject;
    double a, b, c, d, e;
    std::ifstream fp("data.dat");
    while (fp >> a >> b >> c >> d >> e)
    {
        myObject.function(a, b, c, d, e);
    }
    myObject.print();
    return 0;
}

编辑:

为了读取带有以#开头的注释行且从未在5个值组合之间交织的数据文件,您可以执行以下操作:
while (fp)
{
    while (isspace(fp.peek()) != 0) { fp.ignore(1); }
    if (fp.peek() == '#')
    {
        fp.ignore(std::numeric_limits<streamsize>::max(), '\n');
    }
    else if (fp >> a >> b >> c >> d >> e)
    {
        myObject.function(a, b, c, d, e);
    }
}

关于c++ - 如何在C++中将不同的函数应用于文本文件中的每组5个数字?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23800259/

10-11 23:19
查看更多