提问者:小点点

如何从文本文件中使用chrono::system_clock? [副本]


我有以下几种情况:我正在编写两个程序,第一个程序从windows开始,在一个文本文档中写入当前的系统时间。 其代码如下所示:

auto start = std::chrono::system_clock::now();
std::time_t start_time = std::chrono::system_clock::to_time_t(start);

ofstream Write ("Time.txt");
Write << std::ctime(&start_time);

日期格式如下:Thu Jul 16 14:19:53 2020。

我的第二个程序在关机时自动启动。 它应该构建当前系统时间和开始时间之间的差异,并将该差异写入不同的文本文档中。

#include <iostream>
#include <ctime>
#include <string>
#include <cmath>
#include <fstream>
#include <chrono>
#include <windows.h>

using namespace std;

double k; //Get leftover time from txt doc//
int s;    //Seconds//
int m;    //Minutes//   
int h;    //Hours//
int d;    //Days//
long int z;    //Var containing new leftover time//


int main()
{

    ifstream Time ("Time.txt");
        Time >> start;
        //Get starting time//


    ifstream Check ("Test.txt");
        Check >> d; //Reading days from txt doc to d//
        Check >> h; //Reading hours from txt doc to h//
        Check >> m; //Reading minutes from txt doc to m//
        Check >> s; //Reading seconds from txt doc to s//

    k = (s + 60*m + 3600*h + 24*3600*d);

    auto end = std::chrono::system_clock::now();
    //Get current time ending the program//

    std::chrono::duration<double> elapsed_seconds = end-start; 
    //Calculate difference between start and end//

    z = (k-round(elapsed_seconds.count())); 
    //Calculate time difference in seconds//


    //Converting seconds into days, hours, minutes, seconds//
    d = z / (24*3600);
    h = (z / 3600) % 24;
    m = (z / 60) % 60;
    s = z % 60;
    //End of converting//

    ofstream Write ("Test.txt");
        Write << d << "\n" << h << "\n" << m << "\n" << s;  
        //Write all values back to txt doc//

    }

我遇到的问题是,我不知道如何从time.txt中获取开始时间,其格式可以用于这个chrono操作std::chrono::duration<;double>; elapsed_seconds=End-Start

我试着在启动程序中设置它

std::time_t start_time = std::chrono::system_clock::to_time_t(start);
ifstream Time ("Time.txt");
Time >> start;

结果是:test.txt中出现了一个荒谬的负数,这显然是错误的,因为我没有搞乱系统时间。

一个字符串变量也帮不了我多少忙。 它完成了将txt行复制到string变量的工作,但是后来我没能将它转换成正确的chrono变量。

我希望有人对如何做到这一点有个主意。 我已经感谢你的回答了。


共1个答案

匿名用户

为什么把时间作为字符串写入文件? std::time_t是算术类型。 你可以直接写和读

#include <iostream>
#include <fstream>
#include <ctime>
#include <chrono>
#include <thread>

using std::literals::chrono_literals::operator""s;

int main() {
    {
        auto start = std::chrono::system_clock::now();
        std::time_t start_time = std::chrono::system_clock::to_time_t(start);
        std::ofstream file("file.txt");
        file << start_time;
        std::cout << start_time << '\n';
    }
    std::this_thread::sleep_for(3s);
    {
        std::time_t start_time;
        std::ifstream file("file.txt");
        file >> start_time;
        std::cout << start_time << '\n';
        auto start = std::chrono::system_clock::from_time_t(start_time);
        auto end = std::chrono::system_clock::now();
        std::cout << std::chrono::duration_cast<std::chrono::seconds>(end-start).count();
    }
}