web-dev-qa-db-ja.com

ctimeから\ nを渡さずにfprintfと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をで使用するとそうすることができません。 fprintfの前のctime関数は、ctime内の\ nを認識するため、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));
17
BugShotGG

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"

26
Kerrek SB

%.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
9
Guest
  1. ctime()の戻り値を一時文字列にコピーし、その一時文字列から_'\n'_を削除してから、一時文字列を出力します。
  2. Printf変換の(フィールド幅と)精度を使用して、ctime()からの戻り値の最初の24文字だけを出力します。
9
pmg

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]
7
MDMower

c ++ 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

5
Caner

どうですか:

char *p;
int len;

/* ... */

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

そうすれば、文字列から最後の文字を引いたものだけが出力されます(つまり、\n)。

3
FatalError

私はctime文字列を取得した後にこれを行いました:

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

これは、ctimeキャリッジリターンを文字列終了文字で上書きするだけで、文字列を1文字ではなく2文字の「\ 0」文字で効果的に終了します。 (そもそもctimeがそれを行うのは奇妙に思えます。)

1
Steven

単に:

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

これが実際に行うことは、ctime配列のstrlen(この場合は改行文字)をヌルターミネータ文字に置き換えることです。これは、末尾の '\ n'から改行文字を切り取り、1文字の配列を短縮します。

Strlenが以前は25だった場合、この後は24になるはずです。

0
damian1baran

'length-1'バイトを別の文字列にコピーするだけです。

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