GNU C i printf oraz znacznik czasu

Potrzebujesz pomocy z C, C++, perl, python, itp.
Awatar użytkownika
ShinnRa
Beginner
Posty: 457
Rejestracja: 05 marca 2007, 23:05
Lokalizacja: Gdynia

GNU C i printf oraz znacznik czasu

Post 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.
Czocher
Beginner
Posty: 140
Rejestracja: 26 maja 2007, 23:19

Post 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).
kabanek
Posty: 16
Rejestracja: 15 lipca 2010, 18:07

Post 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]
Awatar użytkownika
ShinnRa
Beginner
Posty: 457
Rejestracja: 05 marca 2007, 23:05
Lokalizacja: Gdynia

Post 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?
kabanek
Posty: 16
Rejestracja: 15 lipca 2010, 18:07

Post autor: kabanek »

ShinnRa, to napisz funkcję, która to robi.
Rad
Member
Posty: 1208
Rejestracja: 28 czerwca 2006, 15:05

Post 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;
}
ODPOWIEDZ