Программирование >>  Разработка устойчивых систем 

1 ... 47 48 49 [ 50 ] 51 52 53 ... 196


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 месяцев



1 ... 47 48 49 [ 50 ] 51 52 53 ... 196

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика