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 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>
#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.

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';

}

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)


Yayımlandı

kategorisi

yazarı:

Etiketler:

Yorumlar

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir