2012-02-01 11 views
11

Ho un problema con l'inserimento del tempo in un file di testo. Io uso il seguente codice e ottengo |21,43,1,3,10,5| Wed Feb 01 20:42:32 2012 che è normale ma quello che VOGLIO FARE è posizionare il tempo prima dei numeri ad esempio come Wed Feb 01 20:42:32 2012 |21,43,1,3,10,5| Tuttavia, non posso farlo quando uso il fprintf con la funzione ctime prima di fprintf i numeri che riconosce \ n in ctime e quindi cambia la prima riga e poi stampa i numeri. Va come:fprintf e ctime senza passare n da ctime

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

che è qualcosa che io non voglio ... Come posso fprintf il tempo senza swiching alla riga successiva nel testo ??? Grazie in anticipo!

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

risposta

21

è possibile utilizzare una combinazione di strftime() e localtime() per creare una stringa personalizzata formattata del timestamp:

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 stringa di formato utilizzato da ctime è semplicemente "%c\n".

+0

bella risposta. Ci proverò anche io. – BugShotGG

+0

@Kerrek SB, hai supposto il formato "% c \ n" nell'ultima riga? –

+0

Bello! 'strftime' consente un approccio molto flessibile per stampare il timestamp in diversi formati! – sg7

7
  1. Copia il ritorno di ctime() a una stringa temporanea, rimuovere il '\n' da quella stringa temporanea, quindi stampare la stringa temporanea.
  2. Stampa solo i primi 24 caratteri del ritorno da ctime() utilizzando la (larghezza del campo e) precisione della conversione di printf.
0

Basta copiare 'length - 1' byte in un'altra stringa.

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

Probabilmente è una buona idea annullare la stringa in seguito. – FatalError

3

ne dite:

char *p; 
int len; 

/* ... */ 

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

In questo modo esso stampa solo la stringa meno l'ultimo carattere (vale a dire la \n).

+3

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

0

Semplicemente:

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

Ciò effettivamente fare si che sostituisce strlen - 1 carattere (nuovo char linea in questo caso) di ctime array con carattere nullo terminatore - taglia fuori nuova linea carattere dall'estremità '\ n' e abbreviare un array di 1 carattere.

Se strlen era di 25, prima, dopo questo dovrebbe essere 24.

1

ho fatto questo dopo aver ottenuto la stringa ctime:

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

Questo sovrascrive solo il ritorno a capo ctime con un carattere di terminazione della stringa, terminando efficacemente la stringa con due caratteri '\ 0' invece di uno. (Sembra strano che ctime fa che, in primo luogo.)

3

Basta usare% .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

È possibile utilizzare strtok() per sostituire \n con \0.Ecco un minimo esempio di lavoro:

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

uscita:

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

in C++ 11 si può fare questo in questo modo:

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

uscita:

2017-06-05 00:31:49

Problemi correlati