2

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

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

4 回答 4

8

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

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

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

于 2013-01-17T00:23:11.880 回答
3

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

关于 Windows 的注意事项:Windows 有两个换行符,回车符'\r'和常规换行符'\n'因此,在 Windows 上,您必须在倒数第二个字符处终止。如果您希望您的代码可以跨 Windows 和非 Windows 平台移植,则必须为此添加检查。

于 2013-01-17T00:24:19.117 回答
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
于 2015-12-07T16:52:43.803 回答
-1

这将起作用:

date = date.substr(0, date.size()-1);
于 2020-04-30T08:14:25.773 回答