Strona 1 z 1

GNU C i printf oraz znacznik czasu

: 04 września 2010, 02:34
autor: ShinnRa
Piszę sobie w C pod linuksem (gcc (Debian 4.4.4-9) 4.4.5 20100816 (prerelease)) mały programik i potrzebuję znacznika czasu w postaci [RRRR/mm/dd HH:MM:SS]. Przy pomocy google'a napisałem coś takiego:

Kod: Zaznacz cały

char *log_file_timestamp()
{
        char outtime[32];
        time_t rawtime;
        struct tm * timeinfo;
       
        time ( &rawtime );
        timeinfo = localtime (&rawtime);
       
        if (timeinfo == NULL)
        {
                fprintf(stderr, "%s: localtime(): returned NULL value\n", PACKAGE);
                exit(EXIT_FAILURE);
        }
        //"%a, %d %b %Y %H:%M:%S %z"
        if (strftime (outtime, sizeof(outtime), "[%Y/%m/%d %H:%M:%S]", timeinfo) == 0)
        {
                fprintf(stderr, "%s: strftime(): returned 0\n", PACKAGE);
                exit(EXIT_FAILURE);
        }
        char *out = outtime;
        return out;
}
potem w kodzie używam go tak:

Kod: Zaznacz cały

printf("%s test", log_file_timestamp());
i zamiast

Kod: Zaznacz cały

[2010/09/04 01:40:38] test
dostaję

Kod: Zaznacz cały

���~� test

i nie wiem gdzie tkwi błąd.

: 04 września 2010, 03:15
autor: Czocher
Czegoś tutaj nie łapię - czy to jest funkcja, czy wskaźnik na funkcję?

Edycja:
To tylko moje późnonocne zaplątanie, przepraszam. Zobacz czy czas wyjściowy (ang. outtime) jest dobrze ustawiany - u Ciebie wyrzuca losowe znaki a u mnie nic (co by znaczyło, że tak jakby wyrzuca jakiś zajęty ale niewyczyszczony kawałek pamięci).

: 04 września 2010, 09:27
autor: kabanek
Ja znalazłem coś takiego:

Kod: Zaznacz cały

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

main()
{
    time_t rawtime;
    struct tm * timeinfo;
    char buffer [80];

    time ( &rawtime );
    timeinfo = localtime ( &rawtime );

    strftime (buffer,80,"[%Y/%m/%d %H:%M:%S]",timeinfo);
    puts (buffer);

    return 0;
}
A wyświetla np.:

Kod: Zaznacz cały

[2010/09/04 09:25:30]

: 04 września 2010, 12:30
autor: ShinnRa
kabanek, taka postać tego kodu u mnie też działa ale to nie jest to co ja chcę osiągnąć, nie będę pisał 5/6 linijek kodu gdy tylko chcę wypisać czas.

Czocher, to jak działa funkcja localtime skoro zwraca strukturę tm. Nigdzie nie mogę znaleźć jej kodu by zobaczyć jak ona jest skonstruowana.

Edycja
[...]że jest słownie jedna kopia struktury tm, statyczna, używana przez kilka funkcji. Localtime wypełnia strukturę swoimi danymi i zwraca jej adres - wywołasz jeszcze raz to otrzymasz wskaźnik do tej samej struktury w tym samym miejscu pamięci, stare dane zostaną nadpisane. Funkcja stworzona w czasach, kiedy nikt nie myślał o czymś takim jak thread-safe.
tak więc to odpowiada na moje pytanie o localtime.

W takim razie jak napisać funkcję w C zwracającą ciąg znaków?

: 04 września 2010, 19:03
autor: kabanek
ShinnRa, to napisz funkcję, która to robi.

: 11 września 2010, 16:05
autor: Rad
Problem polega na tym, że zwracasz lokalną tablicę, w której po opuszczeniu funkcji nie będzie potrzebnych danych.

Np. taki kod będzie działać poprawnie:

Kod: Zaznacz cały

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

void log_file_timestamp(char data[], size_t size_data)
{
   time_t rawtime;
   struct tm * timeinfo;
       
   time ( &rawtime );
   timeinfo = localtime (&rawtime);
       
   if (timeinfo == NULL)
   {
       fprintf(stderr, "localtime(): returned NULL value\n");
       exit(EXIT_FAILURE);
   }
   //"%a, %d %b %Y %H:%M:%S %z"
   if (strftime (data, size_data, "[%Y/%m/%d %H:%M:%S]", timeinfo) == 0)
   {
       fprintf(stderr, "strftime(): returned 0\n");
       exit(EXIT_FAILURE);
   }

}

int main()
{
   char data[80];
   log_file_timestamp(data, sizeof(data));
   printf("%s test\n", data);
   return 0;
}