Fprintf и ctime без передачи \n из ctime

У меня проблема со вставкой времени в текстовый файл. Я использую следующий код, и я получаю |21,43,1,3,10,5| Wed Feb 01 20:42:32 2012, что нормально, но что я ХОЧУ ДЕЛАТЬ, поместите время до чисел, например, как Wed Feb 01 20:42:32 2012 |21,43,1,3,10,5| Однако я не могу это сделать, когда я использую fprintf с функцией ctime перед fprintf числа, которые он распознает \n в течение ctime, и поэтому он меняет строку 1-го и затем печатает числа. Он выглядит следующим образом:

    Wed Feb 01 20:42:32 2012
    |21,43,1,3,10,5|

что-то, чего я не хочу... Как я могу fprintf время без перехода на следующую строку в тексте??? Спасибо заранее!

fprintf(file,"   |");
    for (i=0;i<6;i++)
    {
        buffer[i]=(lucky_number=rand()%49+1);       //range 1-49
        for (j=0;j<i;j++)                           
        {
            if (buffer[j]==lucky_number)
                i--;
        }
        itoa (buffer[i],draw_No,10);
        fprintf(file,"%s",draw_No);
        if (i!=5)
            fprintf(file,",");
    }
    fprintf(file,"|     %s",ctime(&t));

Ответ 1

Вы можете использовать комбинацию strftime() и localtime(), чтобы создать пользовательскую отформатированную строку вашей метки времени:

char s[1000];

time_t t = time(NULL);
struct tm * p = localtime(&t);

strftime(s, 1000, "%A, %B %d %Y", p);

printf("%s\n", s);

Строка формата, используемая ctime, просто "%c\n".

Ответ 2

  • Скопируйте return ctime() во временную строку, удалите '\n' из этой временной строки, затем распечатайте временную строку.
  • Распечатайте только первые 24 символа возврата из ctime() с помощью (ширины поля и) точности преобразования printf.

Ответ 3

Просто используйте%.19s:

struct timeb timebuf;
char *now;

ftime( &timebuf );
now = ctime( &timebuf.time );

/* Note that we're cutting "now" off after 19 characters to avoid the \n
that ctime() appends to the formatted time string.   */
snprintf(tstring, 30, "%.19s", now);  // Mon Jul 05 15:58:42

Ответ 4

Вы можете использовать strtok() для замены \n на \0. Вот минимальный рабочий пример:

#include <stdio.h>
#include <string.h>
#include <time.h>

int main() {
    char *ctime_no_newline;
    time_t tm = time(NULL);

    ctime_no_newline = strtok(ctime(&tm), "\n");
    printf("%s - [following text]\n", ctime_no_newline);

    return 0;
}

Вывод:

Sat Jan  2 11:58:53 2016 - [following text]

Ответ 5

Как насчет:

char *p;
int len;

/* ... */

p = ctime(&t);
len = strlen(p);
fprintf(file,"|     %.*s", len - 1, p);

Таким образом, он печатает только строку минус последний символ (т.е. \n).

Ответ 6

в С++ 11 вы можете сделать это так:

#include <iostream>
#include <chrono>
#include <iomanip>
using namespace std;
using namespace chrono;

// Prints UTC timestamp
void printTime() {
    time_point<system_clock> now = system_clock::now();
    time_t now_time = system_clock::to_time_t(now);

    auto gmt_time = gmtime(&now_time);
    auto timestamp = std::put_time(gmt_time, "%Y-%m-%d %H:%M:%S");
    cout << timestamp << endl;
}

Выход:

2017-06-05 00:31:49

Ответ 7

Я сделал это после получения строки ctime:

#include <string.h>
...
myctime[ strlen(myctime) - 1 ] = '\0';

Это просто перезаписывает возврат каретки ctime с символом завершения строки, эффективно завершая строку двумя символами '\ 0' вместо одного. (Кажется странным, что ctime делает это в первую очередь.)

Ответ 8

Просто скопируйте 'length - 1' байт в другую строку.

strncpy( newString, draw_No, strlen(draw_no) - 1 );

Ответ 9

Просто:

    c_time_string = ctime(&current_time);
    len_of_new_line = strlen(c_time_string) - 1;
    c_time_string[len_of_new_line] = '\0';

На самом деле это заменяет strlen - 1 char (новая строка char в этом случае) массива ctime с символом нуль-терминатора - он вырезает новый символ строки из конца '\n' и сокращает массив из 1 символа.

Если strlen было 25 до, после этого должно быть 24.