繁体   English   中英

如何在C ++中将不同的函数应用于文本文件中的每组5个数字?

[英]How do I apply different functions to each group of 5 numbers in a text file in C++?

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

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 ++中有惯用的方法吗?

UPDATE

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

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

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

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>标准库。 这使用fstreambool运算符参见此处 然后,您可以调用想要更改其状态或使用其状态或直接在循环内部更改某些状态的任何函数或对象成员。

作为对象的示例,该对象的状态在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);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM