C++'da Zaman: Biçimlendirilmiş girişi ayrıştırma

Adanali

Active member
C++'da Zaman: Biçimlendirilmiş girişi ayrıştırma


  1. C++'da Zaman: Biçimlendirilmiş girişi ayrıştırma







Bu makale, C++20'deki Chrono uzantısıyla ilgili ayrıntılı yolculuğumun onbirincisidir.


Duyuru



  1. C++20'de Zaman: Kronometrik terminolojiye giriş
  2. C++20'de Zaman: Zaman süresi ve zaman noktası ile kronometrik terminolojiye giriş
  3. C++20'de Saat: Günün saati ve takvim tarihi için yeni veri türleri
  4. Şimdi C++20'de: Takvim etkinlikleri oluşturma
  5. C++20'de saat: Takvim randevularını görüntüleyin ve kontrol edin
  6. C++20'de saat: Takvim tarihlerini ve sıra tarihlerini sorgulama
  7. C++20'de Zaman: Saat dilimlerinin kullanımına ilişkin ayrıntılar
  8. C++20'deki saat dilimleri: çevrimiçi dersler
  9. C++20'de Zaman: Krono G/Ç
  10. 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 isbir 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>&#13;
#include <iostream>&#13;
#include <string>&#13;
#include <sstream>&#13;
&#13;
int main() {&#13;
&#13;
std::cout << 'n';&#13;
&#13;
std::chrono::sys_seconds timePoint;&#13;
std::istringstream iStream1{"2021-08-11 21:49:35"}; //(1)&#13;
std::chrono::from_stream(iStream1, "%F %T", timePoint); //(2)&#13;
if (iStream1) std::cout << "timePoint: " &#13;
<< timePoint << 'n';&#13;
else std::cerr << "timepoint: Reading failedn";&#13;
&#13;
std::chrono::year_month_day date1;&#13;
std::istringstream iStream2{"11/08/21"}; //(3)&#13;
std::chrono::from_stream(iStream2, "%x", date1); //(4)&#13;
if (iStream2) std::cout << "date1: " << date1 << 'n';&#13;
else std::cerr << "date1: Reading failedn";&#13;
&#13;
std::chrono::year_month_day date2;&#13;
std::istringstream iStream3{"11/15/21"};&#13;
std::chrono::from_stream(iStream3, "%x", date2); //(5)&#13;
if (iStream3) std::cout << "date2: " << date2 << 'n';&#13;
else std::cerr << "date2: Reading failedn";&#13;
&#13;
std::cout << 'n';&#13;
&#13;
}


(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)&#13;
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&#13;
&#13;
#include <chrono>&#13;
#include <iostream>&#13;
#include <string>&#13;
#include <sstream>&#13;
&#13;
int main() {&#13;
&#13;
std::cout << 'n';&#13;
&#13;
std::chrono::sys_seconds timePoint;&#13;
std::istringstream iStream1{"2021-08-11 21:49:35"};&#13;
iStream1 >> std::chrono::parse("%F %T", timePoint);&#13;
if (iStream1) std::cout << "timePoint: " << timePoint << 'n';&#13;
else std::cerr << "timepoint: Reading failedn";&#13;
&#13;
std::chrono::year_month_day date1;&#13;
std::istringstream iStream2{"11/08/21"};&#13;
iStream2 >> std::chrono::parse("%x", date1);&#13;
if (iStream2) std::cout << "date1: " << date1 << 'n';&#13;
else std::cerr << "date1: Reading failedn";&#13;
&#13;
std::chrono::year_month_day date2;&#13;
std::istringstream iStream3{"11/15/21"};&#13;
iStream3 >> std::chrono::parse("%x", date2);&#13;
if (iStream3) std::cout << "date2: " << date2 << 'n';&#13;
else std::cerr << "date2: Reading failedn";&#13;
&#13;
std::cout << 'n';&#13;
&#13;
}


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)
 
Üst