|
Программирование >> Разработка устойчивых систем
cout reset counter endl: remove(ERRCOUNT.c str()): Удаление файлов renrave(ERRFILE.c str()): return 0: default: cerr usage endl: return 1: if (argc == 3) { Showerr s(argv[l]. ERRCOUNT. ERRFILE. atoi(argv[2])): s.replaceErrorsO: s.saveFilesO: ) III:- Вы можете заменить маркер любым другим по своему усмотрению. Программа построчно читает файлы и ищет в начале каждой строки маркер. При обнаружении маркера строка модифицируется и сохраняется в списке ошибок и в строковом потоке edited. После завершения обработки всего файла он закрывается (с выходом из области видимости), открывается заново для вывода, и в него направляется содержимое edited. Также обратите внимание на сохранение счетчика во внешнем файле. При следующем запуске программы нумерация будет продолжена. Простая программа ведения журнала в приведенном далее примере демонстрируется подход, который может пригодиться для сохранения наборов данных на диске для последующей обработки (например, температурного профиля океанской воды в разных точках). Данные хранятся в классе Data Point: : С04:Datalogger.h Структура записи в журнал #ifndef DATALOGJ #define DATALOG H #include <ctime> #include <iosfwd> #include <string> using std::ostream: struct Coord { int deg. min. sec: Coord(int d = 0. int m = 0. int s = 0) : deg(d). min(m). sec(s) {) std::string toStringO const: ostream& operator (ostream&, const Coord&): class DataPoint { std::time t timestamp: Время и дата Coord latitude, longitude: double depth, temperature: public: DataPoint(std::time t ts, const Coord& lat. const Coord& Ion, double dep, double temp) : timestamp(ts). latitude(lat), longitude(lon). string Coord::toString() const { ostringstream os; OS *this: return os.strO: ostreamS operator (ostream& os. const DataPointS d) { os.setf(ios::fixed, ios::floatfield): char fillc = os.fill(0): Дополнение слева символами О tm* tdata = localt ime(&d.timestamp): OS setw(2) tdata->tm mon + 1 W setw(2) tdata->tm mday W setw(2) tdata->tm year+1900 setw(2) tdata->tm hour : setw(2) tdata->tm min : setw(2) tdata->tm sec: os.fill( ): Дополнение слева символами streamsize prec = os.precision(4): OS Lat: setw(9) d.latitude.toString() , Long: setw(9) d.longitude.toStringO . depth: setw(9) d.depth . temp: setw(9) d.temperature: os.fill(fillc): os.precision(prec): return OS: } /:- Функция Coord::toString() необходима, поскольку оператор типа DataPoint вызывает setw() перед выводом широты и долготы. Если бы вместо этого для Coord использовался оператор , то ширина поля относилась бы только к первой операции вывода (то есть Coord::deg), поскольку все изменения ширины немедленно отменяются после первого вывода. Вызов setf() обеспечивает вывод вещественных depth(dep), temperature(temp) {) DataPointO : timestamp(O), depth(O), temperature(O) {} friend ostreamS operator (ostream&. const DataPointS): #endif DATALOG H /:- Структура Data Point состоит из метки времени, хранящейся в переменной типа time t (определяется в <ctime>), двух координат (широты и долготы), а также значений глубины и температуры. Оператор упрощает форматирование данных. Ниже приводится файл реализации: : С04:Datalogger.срр {0} Реализация Datapoint #include Datalogger.h #1 nclude <iomanip> #1nclude <iostream> #1 nclude <sstream> #include <str1ng> using namespace std; ostreamS operator (ostream& os. const Coord& c) { return OS c.deg * c.min \ c.sec ; int tm year int tm wday int tni yday Прошло лет с 1900 Воскресенье == О и т. д. 0-365. день года int tm isdst; Летнее время? Генератор тестовых данных Следующая программа создает два файла: первый файл содержит двоичные данные и создается функцией write(), а второй содержит данные ASCII и создается с использованием оператора для класса DataPoint. Данные также можно вывести на экран, но удобнее просматривать их в виде файла. : C04:Datagen.cpp Генератор тестовых данных {L} Datalogger #include <cstdlib> #include <ctime> #include <cstring> #include <fstream> #include Datalogger.h #include ../require.h using namespace std; int mainO { time t timer: srand(time(&timer)) Раскрутка генератора случайных чисел ofstream data( data.txt ): assure(data. data.txt ): ofstream bindata( data.bin , ios::binary): assure(bindata, data.bin ): for(int i =0: i < 100: i++. timer += 55) ( От 0 до 199 метров: double newdepth = randO % 200: double fraction = randO % 100 + 1: newdepth += 1.0 / fraction: double newtemp = 150 + rand()200: По шкале Кельвина fraction = randO 100 + 1: newtemp += 1.0 / fraction: const DataPoint d(timer. Coord(45,20,31). Coord(22,34.18). newdepth. newtemp): data d endl: bindata.write(reinterpret cast<const char*>(&d), sizeof(d)): } /:- чисел с фиксированной точностью, а функция precision() задает точность в четыре цифры в дробной части. Также обратите внимание на восстановление заполнителя и точности, действовавших перед вызовом оператора . Чтобы получить данные метки времени, хранящиеся в DatePoint::tiinestamp, мы вызываем функцию std::localtiine(), которая возвращает статический указатель на объект tm. Структура tm определяется следующим образом: struct tm { int tm sec: 0-59 секунд int t[Ti min; 0-59 минут int tm hour: 0-23 часов int tm mday: День месяца int tm mon; 0-11 месяцев
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |