У меня простой вопрос, если я хочу напечатать значение в той же строке, что и вывод моего системного времени, возможно ли это?
char *date;
time_t timer;
timer=time(NULL);
date = asctime(localtime(&timer));
//printf("Current Date: %s", date);std::cout << date << ", " << randomNumber << std::endl;
if (file.is_open())
{
file << date;
file << ", ";
file << randomNumber;
file << "\n";
}
Я надеялся, что это произойдет в результате:
Wed Jan 16 16:18:56 2013, randomNumber
Но в результате я получаю в своем файле:
Wed Jan 16 16:18:56 2013
, randomNumber
Кроме того, я просто сделал простой std :: cout, и я заметил тот же результат. Кажется, что система форсирует конечную строку в конце вывода, есть ли вообще, я могу подавить это?
Вы можете просто заменить символ ‘\ n’ в строке даты (если нулевое значение завершено, он должен быть в strlen (date) — 1) на ‘\ 0’, и он должен печататься в той же строке.
date[strlen(date) - 1] = '\0';
РЕДАКТИРОВАТЬ: Как указал Иоахим strlen
возвращает длину без терминатора NULL, а не необработанной длины выделения, поэтому она должна быть -1, а не -2.
Символ новой строки является последним символом в строке, возвращенной из asctime
, Самый простой способ удалить его — заменить его символом конца строки '\0'
,
Примечание о Windows: Windows есть два символы для перевода строки, возврата каретки '\r'
и очередной перевод строки '\n'
, Так что на Windows вы должны завершить на второй последний персонаж Если вы хотите, чтобы ваш код был переносимым между платформами Windows и не Windows, вы должны добавить проверки для этого.
Если вы хотите использовать строки, у вас есть лучшие альтернативы.
Это сработало для меня:
#include<iostream>
#include<chrono>
#include<ctime>
using namespace std;
string getDate()
{
chrono::system_clock::time_point tp = chrono::system_clock::now();
time_t t = chrono::system_clock::to_time_t(tp);
const char * tc = ctime(&t);
string str = string {tc};
str.pop_back();
return str;
}
int main(){
cout << getDate() << endl << hi;
}
Выход:
Mon Dec 7 17:40:01 2015
hi