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
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:
arse 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
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:
arse
Benzer std::chrono::from_stream işlevi kullanabilirsiniz std::chrono:
arse 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:
arse(fmt, chro)
Yerine std::chrono::from_stream olur std::chrono:
arse doğrudan giriş akışında is isminde. std::chrono:
arse 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:
arse 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:
arse("%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:
arse("%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:
arse("%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)
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
- 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:
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
- 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
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:
Benzer std::chrono::from_stream işlevi kullanabilirsiniz std::chrono:
std::chrono::from_stream(is, fmt, chro)
is >> std::chrono:
Yerine std::chrono::from_stream olur std::chrono:
Bu nedenle önceki programı kullanabilirim inputChrono.cpp ile std::chrono::from_stream doğrudan programda inputChronoParse.cpp ile std::chrono:
// 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:
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:
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:
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)