• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Czas systemowy z użyciem bibliotek standardowych

Object Storage Arubacloud
0 głosów
802 wizyt
pytanie zadane 9 stycznia 2016 w C i C++ przez kokardka_989 Nowicjusz (120 p.)
Mam do zrobienia grę, w której muszę pobrać czas systemowy - zapisać datę i godzinę do pliku: ma być w formacie RRRR-MM-DD.Hour:Min:Sec. (R - rok, M - miesiąc, D - dzień; Hour - godzina, Min - minuta, Sec - sekunda). Próbowałam różnych sposobów, znalezionych na różnych stronach internetowych, aż w końcu któryś mi zadziałał, jednakże użyłam biblioteki <windows.h>, a ona z tego, co się orientuję - nie należy do standardowych, których tylko powinnam używać.

Teraz mój fragment kodu wygląda tak:

                       SYSTEMTIME st;
                       GetLocalTime(&st);
 
                       int godzina = st.wHour;
                       int minuta  = st.wMinute;
                       int sekunda = st.wSecond;
                       int dzien = st.wDay;
                       int miesiac = st.wMonth;
                       int rok = st.wYear;     

Ale muszę to zmienić. Czy ktoś byłby w stanie mi jakoś pomóc?

2 odpowiedzi

+1 głos
odpowiedź 9 stycznia 2016 przez niezalogowany
komentarz 9 stycznia 2016 przez kokardka_989 Nowicjusz (120 p.)
Dziękuję, fragment kodu z tej strony działa i pokazuje czas. Mam tylko jeszcze jedno pytanie - jak go "przerobić" tak, aby móc modyfikować wygląd daty i godziny? RRRR-MM-DD.Hour:Min:Sec. (R - rok, M - miesiąc, D - dzień; Hour - godzina, Min - minuta, Sec - sekunda)
komentarz 9 stycznia 2016 przez Qhoros Mądrala (7,110 p.)
+1 głos
odpowiedź 9 stycznia 2016 przez Sebastian Fojcik Nałogowiec (43,040 p.)
edycja 9 stycznia 2016 przez Sebastian Fojcik

Jest standardowa biblioteka <ctime>. Za jej pomocą możesz zawładnąć czasem :-) Pokażę Ci jak to zrobić:

#include <iostream>
#include <ctime>

using namespace std;

int main()
{
	time_t czas;
	tm timeinfo;

	time( &czas );
	localtime_s( &timeinfo, &czas );

	int godzina = timeinfo.tm_hour;
	int minuta = timeinfo.tm_min;
	int sekunda = timeinfo.tm_sec;
	int dzien = timeinfo.tm_mday;
	int miesiac = timeinfo.tm_mon;
	int rok = timeinfo.tm_year;

	return 0;
}

Korzystanie z localtime, który ktoś polecił może być niebezpieczne. W moim środowisku Visual Studio użycie tej funkcji powoduje błąd kompilacji z komunikatem, że jest niebezpieczna w użyciu. Dlatego ja polecę Ci bezpieczniejsze rozwiązanie, którym jest localtime_s.
Różnica niby mało istotna, ale jednak się kompiluje.

Pozdrawiam :-)

PS. Użycie funkcji localtime powoduje błąd z następującym komunikatem:
error C4996: 'localtime': This function or variable may be unsafe. Consider using localtime_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

Jak już uczymy się nowych rzeczy, to uczmy się nowych rzeczy takich, które zadziałają na każdym kompilatorze :-P

Podobna sytuacja jest teraz z getch(). Funkcja ta pochodzi z biblioteki <conio.h>. Ostre nawiasy sugerują, że jest to biblioteka standardowa... otóż nie. Standard języka C++ mówi o tym, że jeśli biblioteka:
Należy do standardu języka C++ to nie posiada rozszerzenie .h. Dlatego w C++ powinno się używać
<ctime> zamist <time.h>. Ta druga wersja z .h pochodzi z języka C.
<cstdlib> zamiast <stdlib.h>
<cmath> zamiast <math.h> i tak dalej...
Kontynuując moje rozważania, standard mówi jeszcze, że:

Jeśli jakaś funkcja nie należy do standardowej biblioteki języka C++, to jej nazwę rozpoczynamy znakiem '_'. 
Jak wspomniałem wyżej <conio.h> to nie jest standardowa biblioteka, a getch(), to nie jest funkcja ze standardowej biblioteki. W związku z czym zgodnie ze standardem należy tę funkcję wywoływać tak: _getch();

W moim kompilatorze Visual Studio użycie getch() powoduje błąd kompilacji z następującym komunikatem:
error C4996: 'getch': The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: _getch. 
Czyli w skrócie: Zgodnie ze standardem języka ISO C++ należy użyć nazwy _getch().

komentarz 9 stycznia 2016 przez kokardka_989 Nowicjusz (120 p.)
Dziękuję bardzo bardzo serdecznie :)
komentarz 9 stycznia 2016 przez Sebastian Fojcik Nałogowiec (43,040 p.)
Moje "PS" po drobnej edycji jest dłuższe od samej wypowiedzi, ale czasem tak mam, że rozpiszę się za bardzo :-D
komentarz 9 stycznia 2016 przez kokardka_989 Nowicjusz (120 p.)
Dziękuję i tak, ale niestety znowu mam problem, ponieważ mój program się nie chce jak na złość skompilować, gdyż pokazuje mi komunikat, że 'localitme_s was not declared in this scope'. Próbowałam to jakoś modyfikować, ale na razie nic mi nie zadziałało :(
komentarz 9 stycznia 2016 przez Sebastian Fojcik Nałogowiec (43,040 p.)

Właśnie czytam, że nie wszystkie kompilatory obsługują funkcję localtime_s. To znaczy, że jedyną funkcją jaką możesz się posłużyć jest zwykły localtime. Użytkownicy forum Stackoverflow zaznaczają, że w tych kompilatorach ta funkcja powinna być bezpieczna. Przepraszam w takim razie. Nie znam wszystkich kompilatorów.

#include <iostream>
#include <ctime>

using namespace std;

int main()
{
	time_t czas;
	tm timeinfo;

	time( &czas );
	timeinfo = *localtime( &czas );

	int godzina = timeinfo.tm_hour;
	int minuta = timeinfo.tm_min;
	int sekunda = timeinfo.tm_sec;
	int dzien = timeinfo.tm_mday;
	int miesiac = timeinfo.tm_mon;
	int rok = timeinfo.tm_year;

	return 0;
}

Tamta gwiazdka przy *localtime jest konieczna, ponieważ funkcja zwraca wskaźnik na strukturę, więc my za pomocą operatora gwiazdki bierzemy to, na co pokazuje wskaźnik.

Jeszcze zaznaczam, że int rok będzie przechowywał ilość lat jakie upłynęły od roku 1900 :-)

Podobne pytania

0 głosów
1 odpowiedź 703 wizyt
pytanie zadane 13 listopada 2017 w C i C++ przez raryk 77 Nowicjusz (160 p.)
0 głosów
1 odpowiedź 136 wizyt
pytanie zadane 24 października 2015 w C i C++ przez niezalogowany
0 głosów
0 odpowiedzi 471 wizyt

92,584 zapytań

141,433 odpowiedzi

319,668 komentarzy

61,966 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...