![](/img/trans.png)
[英]How to apply <cctype> functions on text files with different encoding in c++
[英]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>
标准库。 这使用fstream
的bool
运算符参见此处 。 然后,您可以调用想要更改其状态或使用其状态或直接在循环内部更改某些状态的任何函数或对象成员。
作为对象的示例,该对象的状态在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.