Bu makale, C++20'deki Chrono uzantısıyla ilgili ayrıntılı yolculuğumun onbirincisidir.
Duyuru
- C++20'de Zaman: Kronometrik terminolojiye giriş
- C++20'de Zaman: Zaman süresi ve zaman noktası ile kronometrik terminolojiye giriş
- C++20'de Saat: Günün saati ve takvim tarihi için yeni veri türleri
- Şimdi C++20'de: Takvim etkinlikleri oluşturma
- C++20'de saat: Takvim randevularını görüntüleyin ve kontrol edin
- C++20'de saat: Takvim tarihlerini ve sıra tarihlerini sorgulama
- C++20'de Zaman: Saat dilimlerinin kullanımına ilişkin ayrıntılar
- C++20'deki saat dilimleri: çevrimiçi dersler
- C++20'de Zaman: Krono G/Ç
- C++20: Krono G/Ç: Biçimlendirilmemiş ve biçimlendirilmiş
Rainer Grimm uzun yıllardır yazılım mimarı, ekip ve eğitim yöneticisi olarak çalışmaktadır. C++, Python ve Haskell programlama dilleri üzerine makaleler yazmaktan hoşlanıyor, aynı zamanda özel konferanslarda sık sık konuşmaktan da hoşlanıyor. Modern C++ adlı blogunda C++ tutkusunu yoğun bir şekilde ele alıyor.
Chrono kitaplığı iki şekilde biçimlendirilmiş girişi destekler. Fonksiyonları kullanabilirsiniz std::chrono::from_stream
VEYA std::chrono::parse
kullanım. Her iki işlev de bir girdi akışı alır ve girdiyi belirli bir zamanda format spesifikasyonlarına göre ayrıştırır. Aşağıdakiler hariç tüm format özellikleri %q
sürelerin değişmez değerlerine göre eklenen birim için kullanılabilir.
std::chrono::from_stream
std::chrono::from_stream
farklı saat türleri için aşırı yüklere sahiptir.
Saatler
std::chrono::system_time
std::chrono::utc_time
std::chrono::tai_time
std::chrono::gps_time
std::chrono::file_time
std::chrono::local_time
Takvim tarihleri
std::chrono::year_month_day
std::chrono::year_month
std::chrono::month_day
std::chrono::weekday
std::chrono::year
std::chrono::month
std::chrono::day
Çeşitli aşırı yüklemeler, temel biçimde bir giriş akışı gerektirir is
bir biçim dizesi fmt
ve bir zaman veya takvim nesnesi chro – std::chrono::from_stream(is, fmt, chro)
. Giriş akışındaki Chrono nesnesi daha sonra biçim dizesine göre ayrıştırılır.
Kısaltma da kullanabilirsiniz abb
bir saat dilimi için ve bir UTC saat farkı belirtin: std::chrono::from_stream(is, fmt, chro, abb, off).
Ofset veri türüne sahiptir std::chrono::minutes.
program inputChrono.cpp
bir giriş akışından takvim saatini ve tarihini okumak için biçimlendirilmiş girişi kullanır.
// inputChrono.cpp
#include <chrono>
#include <iostream>
#include <string>
#include <sstream>
int main() {
std::cout << 'n';
std::chrono::sys_seconds timePoint;
std::istringstream iStream1{"2021-08-11 21:49:35"}; //(1)
std::chrono::from_stream(iStream1, "%F %T", timePoint); //(2)
if (iStream1) std::cout << "timePoint: "
<< timePoint << 'n';
else std::cerr << "timepoint: Reading failedn";
std::chrono::year_month_day date1;
std::istringstream iStream2{"11/08/21"}; //(3)
std::chrono::from_stream(iStream2, "%x", date1); //(4)
if (iStream2) std::cout << "date1: " << date1 << 'n';
else std::cerr << "date1: Reading failedn";
std::chrono::year_month_day date2;
std::istringstream iStream3{"11/15/21"};
std::chrono::from_stream(iStream3, "%x", date2); //(5)
if (iStream3) std::cout << "date2: " << date2 << 'n';
else std::cerr << "date2: Reading failedn";
std::cout << 'n';
}
(1 ve 2)'de, giriş akışındaki veriler (iStream1
) biçim dizesi ("%F %T")
. Aynı şey giriş akışı için de geçerli iStream2
(3) ve karşılık gelen format dizesi "%x"
(4). Buna karşılık on beşinci ay yoktur ve (5)'teki analiz adımı başarısız olur. Sonuç olarak, başarısızlık iStream3
ayarlanır. Kullanımı iStream3
Boole ifadesinde false.
std::chrono::parse
Benzer std::chrono::from_stream
işlevi kullanabilirsiniz std::chrono::parse
Girişi ayrıştırmak için kullanın. Aşağıdaki kod parçacığı bunların eşdeğerliğini gösterir.
std::chrono::from_stream(is, fmt, chro)
is >> std::chrono::parse(fmt, chro)
Yerine std::chrono::from_stream
olur std::chrono::parse
doğrudan giriş akışında is
isminde. std::chrono::parse
ayrıca bir biçim dizesi gerektirir fmt
ve bir Chrono öğesi chro
.
Bu nedenle önceki programı kullanabilirim inputChrono.cpp
ile std::chrono::from_stream
doğrudan programda inputChronoParse.cpp
ile std::chrono::parse
yeniden yazmak.
// inputChronoParse.cpp
#include <chrono>
#include <iostream>
#include <string>
#include <sstream>
int main() {
std::cout << 'n';
std::chrono::sys_seconds timePoint;
std::istringstream iStream1{"2021-08-11 21:49:35"};
iStream1 >> std::chrono::parse("%F %T", timePoint);
if (iStream1) std::cout << "timePoint: " << timePoint << 'n';
else std::cerr << "timepoint: Reading failedn";
std::chrono::year_month_day date1;
std::istringstream iStream2{"11/08/21"};
iStream2 >> std::chrono::parse("%x", date1);
if (iStream2) std::cout << "date1: " << date1 << 'n';
else std::cerr << "date1: Reading failedn";
std::chrono::year_month_day date2;
std::istringstream iStream3{"11/15/21"};
iStream3 >> std::chrono::parse("%x", date2);
if (iStream3) std::cout << "date2: " << date2 << 'n';
else std::cerr << "date2: Reading failedn";
std::cout << 'n';
}
Sıradaki ne?
Artık Chrono Kütüphanesi'ne tam olarak girişimi tamamladım. Bir sonraki yazımda C++20'de eşzamanlılık hakkında yazacağım.
(kendim)
Bir yanıt yazın