我在Python和前卵子阶段的C++阶段,但我正在尽我最大的努力,特别是“不要重复你自己”的原则。在
我有一个多通道的原始文件格式要打开,有一个主要的ascii头文件,其中的字段可以表示为字符串和整数(总是用空格填充字符编码)。第二部分是N个报头,N是主报头的一个字段,每个报头本身都有更多的文本和数字字段(编码为ascii),参考构成文件其余部分的实际16位多通道流的长度和大小。在
到目前为止,我在C++中有这个工作代码:
#include <iostream>
#include <sstream>
#include <fstream>
#include <string>
#include <map>
using namespace std;
struct Header {
string version;
string patinfo;
string recinfo;
string start_date;
string start_time;
int header_bytes;
string reserved;
int nrecs;
double rec_duration;
int nchannels;
};
struct Channel {
string label;
string transducertype;
string phys_dim;
int pmin;
int pmax;
int dmin;
int dmax;
string prefiltering;
int n_samples;
string reserved;
};
int main()
{
ifstream edf("/home/helton/Dropbox/01MIOTEC/06APNÉIA/Samples/Osas2002plusQRS.rec", ios::binary);
// prepare to read file header
Header header;
char buffer[80];
// reads header fields into the struct 'header'
edf.read(buffer, 8);
header.version = string(buffer, 8);
edf.read(buffer, 80);
header.patinfo = string(buffer, 80);
edf.read(buffer, 80);
header.recinfo = string(buffer, 80);
edf.read(buffer, 8);
header.start_date = string(buffer, 8);
edf.read(buffer, 8);
header.start_time = string(buffer, 8);
edf.read(buffer, 8);
stringstream(buffer) >> header.header_bytes;
edf.read(buffer, 44);
header.reserved = string(buffer, 44);
edf.read(buffer, 8);
stringstream(buffer) >> header.nrecs;
edf.read(buffer,8);
stringstream(buffer) >> header.rec_duration;
edf.read(buffer,4);
stringstream(buffer) >> header.nchannels;
/*
cout << "'" << header.version << "'" << endl;
cout << "'" << header.patinfo << "'" << endl;
cout << "'" << header.recinfo << "'" << endl;
cout << "'" << header.start_date << "'" << endl;
cout << "'" << header.start_time << "'" << endl;
cout << "'" << header.header_bytes << "'" << endl;
cout << "'" << header.reserved << "'" << endl;
cout << "'" << header.nrecs << "'" << endl;
cout << "'" << header.rec_duration << "'" << endl;
cout << "'" << header.nchannels << "'" << endl;
*/
// prepare to read channel headers
int ns = header.nchannels; // ns tells how much channels I have
char title[16]; // 16 is the specified length of the "label" field of each channel
for (int n = 0; n < ns; n++)
{
edf >> title;
cout << title << endl; // and this successfully echoes the label of each channel
}
return 0;
};
我已经说过:
我的问题是:
我是否担心抄近路使这种代码更“Python”(更抽象,更不重复),或者这不是C++中的工作方式?在许多Python的福音传道者(就像我自己一样,因为我喜欢它)强调它的易用性和所有这些。所以,我会想一段时间,如果我做蠢事或只是做正确的事情,但不是那么“自动”,因为非常自然的C++。在
谢谢你的阅读
赫尔顿
您是正确的:正如所写的,代码是重复的(并且没有错误检查)。您读取的每个字段实际上需要采取三到五个步骤,具体取决于要读取的数据类型:
您可以将这三个代码打包成一个函数,这样代码的重复性就更少了。例如,考虑以下函数模板:
现在您的代码可以更加简洁:
^{pr2}$这段代码简单明了,易于理解。如果能用的话,别浪费时间换了。我相信有很多写得不好、复杂、难以理解(可能还有不正确)的代码需要首先修复:)
如果要保存键入,请使用the function I posted earlier,然后:
这样可以省下不少台词。但比这几行更重要的是,你已经实现了少量的模块化:如何读取字段和要读取的字段现在是程序的独立部分。在
相关问题 更多 >
编程相关推荐