打印系统时间后防止新行

时间:2013-01-17 00:21:10

标签: c++ systemtime

我有一个简单的问题,如果我想在与系统时间输出相同的行上打印一个值,这可能吗?

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,我注意到了同样的结果。似乎系统在输出结束处强制终止线,无论如何,我可以抑制它吗?

4 个答案:

答案 0 :(得分:7)

你可以用'\ 0'替换日期字符串中的'\ n'字符(如果null终止它应该在strlen(date) - 1),它应该在同一行上打印。

date[strlen(date) - 1] = '\0';

编辑:正如Joachim所指出的strlen返回的长度没有NULL终止符而不是原始分配长度所以它应该是-1而不是-2。

答案 1 :(得分:3)

换行符是asctime返回的字符串中的最后一个字符。删除它的最简单方法是将其替换为字符串终止符'\0'

关于Windows的说明:Windows为换行符,回车符'\r'和常规换行符'\n'包含两个字符。因此,在Windows上,您必须在第二个最后一个字符处终止。如果您希望代码可以在Windows和非Windows平台上移植,则必须添加对此的检查。

答案 2 :(得分:0)

如果你想使用字符串,你有更好的选择。

这对我有用:

#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

答案 3 :(得分:-1)

这将起作用:

date = date.substr(0, date.size()-1);