fprintf und ctime, ohne \n von ctime zu übergeben

Lesezeit: 3 Minuten

Benutzer-Avatar
BugShotGG

Ich habe ein Problem mit dem Einfügen der Uhrzeit in eine Textdatei. Ich benutze den folgenden Code und ich bekomme |21,43,1,3,10,5| Wed Feb 01 20:42:32 2012 Das ist normal, aber was ich TUN WILL, ist, die Zeit vor die Zahlen zu stellen, zum Beispiel wie Wed Feb 01 20:42:32 2012 |21,43,1,3,10,5| Allerdings kann ich das nicht tun, denn wenn ich die Funktion fprintf mit ctime vor fprintf die Zahlen verwende, erkennt es das \n innerhalb von ctime und ändert daher zuerst die Zeile und druckt dann die Zahlen. Es geht so:

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

was ich nicht will… wie kann ich die zeit ausdrucken ohne zur nächsten zeile im text zu wechseln??? Danke im Voraus!

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

Benutzer-Avatar
Kerrek SB

Sie können eine Kombination aus verwenden strftime() und localtime() So erstellen Sie eine benutzerdefinierte formatierte Zeichenfolge Ihres Zeitstempels:

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

Die Formatzeichenfolge, die von verwendet wird ctime ist einfach "%c\n".

  • gute Antwort. Das werde ich auch versuchen.

    – BugShotGG

    2. Februar 2012 um 10:52 Uhr

  • Nett! strftime ermöglicht einen sehr flexiblen Ansatz zum Drucken des Zeitstempels in verschiedenen Formaten!

    – sg7

    22. November 2016 um 16:13 Uhr


Sie können verwenden strtok() ersetzen \n mit \0. Hier ist ein funktionierendes Minimalbeispiel:

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

Ausgabe:

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

Benutzer-Avatar
Gast

Verwenden Sie einfach %.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

  • Beim Drucken von 19 Zeichen wird das Jahr weggelassen. Wenn Sie das Jahr einschließen möchten, verwenden Sie "%.24s" stattdessen.

    – Jon

    24. April 2019 um 7:30 Uhr

  1. Kopieren Sie die Rückgabe von ctime() zu einer temporären Zeichenfolge, entfernen Sie die '\n' aus dieser temporären Zeichenfolge, und drucken Sie dann die temporäre Zeichenfolge aus.
  2. Drucken Sie nur die ersten 24 Zeichen der Rücksendung aus ctime() indem die (Feldbreite und) Genauigkeit der printf-Konvertierung verwendet wird.

Benutzer-Avatar
Caner

in c++11 kannst du das so machen:

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

Ausgabe:

05.06.2017 00:31:49

  • Ich bin überrascht, dass es so wenige Antworten gibt chrono. Danke Caner, das ist brillant.

    – Avazula

    11. Juli 2018 um 12:27 Uhr

  • Beachten Sie, dass die Reihenfolge von using namespace std; using namespace chrono; Angelegenheiten. Kehren Sie es um, und es wird nicht kompiliert.

    – Wahrheitsanpasser

    9. Januar 2021 um 14:02 Uhr

Benutzer-Avatar
Fataler Fehler

Wie wäre es mit:

char *p;
int len;

/* ... */

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

Auf diese Weise wird nur die Zeichenfolge abzüglich des letzten Zeichens gedruckt (d. h. die \n).

  • Ich bin überrascht, dass es so wenige Antworten gibt chrono. Danke Caner, das ist brillant.

    – Avazula

    11. Juli 2018 um 12:27 Uhr

  • Beachten Sie, dass die Reihenfolge von using namespace std; using namespace chrono; Angelegenheiten. Kehren Sie es um, und es wird nicht kompiliert.

    – Wahrheitsanpasser

    9. Januar 2021 um 14:02 Uhr

Ich habe dies getan, nachdem ich die ctime-Zeichenfolge erhalten hatte:

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

Dies überschreibt einfach den ctime-Wagenrücklauf mit einem String-Beendigungszeichen, wodurch der String effektiv mit zwei ‘\0’-Zeichen anstelle von einem beendet wird. (Es scheint seltsam, dass ctime das überhaupt tut.)

1332020cookie-checkfprintf und ctime, ohne \n von ctime zu übergeben

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy