Я заметил странное поведение при печати вывода в поток. Мой код проходит по большому набору данных и, среди прочего, читает метку времени каждого элемента. Временная метка из первого элемента сохраняется, поэтому можно рассчитать прошедшее время.
CurTime = ev[i].MidasTimeStamp;
RunTimeElapsed = difftime(CurTime,StartTime);
cout << "StartTime: " << ctime(&StartTime) << "CurTime: " << ctime(&CurTime) << "Elapsed: " << RunTimeElapsed << " s" << endl;
Вывод на экран показывает одинаковое время, напечатанное дважды, например:
StartTime: Mon Sep 23 14:44:57 2013
CurTime: Mon Sep 23 14:44:57 2013
Elapsed: 360 s
Но если разбить строку печати на две части:
cout << "StartTime: " << ctime(&StartTime);
cout << "CurTime: " << ctime(&CurTime) << "Elapsed: " << RunTimeElapsed << " s" << endl;
Я получаю ожидаемый результат:
StartTime: Mon Sep 23 14:44:57 2013
CurTime: Mon Sep 23 14:50:57 2013
Elapsed: 360 s
Единственное изменение между двумя выходами касалось линии (ов) касания. Это достаточно легко обойти, но я бы хотел понять, что происходит.
Из документации по ctime
:
Возвращаемое значение указывает на внутренний массив, действительность или значение
может быть изменено любым последующим вызовом asctime или ctime.
Порядок вычисления подвыражений в выражении не указан. В частности, для компилятора допустимо вызывать ctime
сначала дважды, затем позвоните operator<<
как необходимо. Это то, что происходит в вашем случае.
Других решений пока нет …