Я на стадии личинки с 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;
};
Некоторые замечания, которые я уже должен сделать:
- Я решил использовать struct, потому что спецификация формата очень жестко задана;
- Я не выполнял итерации по основным полям заголовка, потому что число байтов и типов для чтения показалось мне довольно произвольным;
- Теперь, когда я успешно получил метку каждого канала, я фактически создал бы структуры для полей каждого канала, которые сами по себе должны быть сохранены, возможно, на карте.
Мой (надеюсь, простой) вопрос:
"Должен ли я беспокоиться о сокращении углов, чтобы сделать этот вид кода более« пифоническим »(более абстрактным, менее повторяющимся), или это не так?y все работает в C ++? "
Многие евангелисты Python (как я сам, потому что мне это нравится) подчеркивают его простоту в использовании и все такое.Итак, я некоторое время удивляюсь, делаю ли я глупые вещи или делаю только правильные, но не настолько "автоматические" из-за самой природы C ++.
Спасибо за чтение
Хелтон