2012-02-01 15 views
11

Tengo un problema con la inserción de tiempo en un archivo de texto. Utilizo el siguiente código y obtengo |21,43,1,3,10,5| Wed Feb 01 20:42:32 2012 que es normal pero lo que QUIERO HACER es colocar el tiempo antes de los números, por ejemplo, como Wed Feb 01 20:42:32 2012 |21,43,1,3,10,5| Sin embargo, no puedo hacerlo porque cuando uso la función fprintf con ctime antes de imprimir los números que reconoce el \ n dentro de ctime, por lo que cambia la línea primero y luego imprime los números. Dice así:fprintf y ctime sin pasar n desde ctime

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

que es algo que yo no quiero ... ¿Cómo puedo fprintf el tiempo sin swiching a la siguiente línea en el texto ??? ¡Gracias por adelantado!

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)); 

Respuesta

21

Se puede utilizar una combinación de strftime() y localtime() para crear una cadena personalizada con formato de la fecha y hora:

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); 

La cadena de formato utilizado por ctime es simplemente "%c\n".

+0

nice answer. Voy a intentar eso también. – BugShotGG

+0

@Kerrek SB, ¿Supusiste formatear "% c \ n" en la última línea? –

+0

¡Agradable! 'strftime' permite un enfoque muy flexible para imprimir la marca de tiempo en diferentes formatos. – sg7

7
  1. Copiar el regreso de ctime() a una cadena temporal, retire la '\n' de esa cadena temporal, a continuación, imprimir la cadena temporal.
  2. Imprima los primeros 24 caracteres de la devolución de ctime() utilizando el (ancho de campo y) la precisión de la conversión de la impresión.
0

Simplemente copie 'length - 1' bytes en otra cadena.

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

Probablemente sea una buena idea anular la secuencia después. – FatalError

3

¿Qué tal:

char *p; 
int len; 

/* ... */ 

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

De esa manera sólo imprime la cadena menos el último carácter (es decir, el \n).

+3

o: printf ("%. * S", (int) strlen (p) -1, p); –

0

Simplemente:

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

Lo que esto realmente va a hacer es Reemplaza strlen - 1 char (Nuevo car línea en este caso) de ctime matriz con carácter terminador nulo - se recorta carácter de nueva línea de punta '\ n' y acortar la matriz de 1 carácter.

Si strlen fue 25 antes de, después de esto debe ser 24.

1

lo hice después de obtener la cadena ctime:

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

Esto se sobrescribe el retorno de carro ctime con un carácter de terminación de cadena, efectivamente terminando la cadena con dos caracteres '\ 0' en lugar de uno. (Parece raro que ctime hace eso en el primer lugar.)

3

sólo tiene que utilizar% .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 
1

Se puede utilizar para reemplazar strtok()\n con \0.Aquí hay un ejemplo de trabajo mínima:

#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; 
} 

Salida:

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

en C++ 11 puede hacerlo de esta manera:

#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; 
} 

Salida:

2017-06-05 00:31:49

Cuestiones relacionadas