如何在不转换的情况下从文件中读取时间

时间:2013-02-20 02:55:02

标签: c++ file-io ipc

我的问题很笼统,但我会用一个具体的例子来解释。

假设我需要在两个应用程序之间传递时间。一种简单的方法是让一个应用程序将gettimeofday()tv_sectv_usec)的输出写入文件,让另一个应用程序读取它。第二个应用程序需要“转换”字符串才能获得timeval的实例。

有没有办法避免转换?

有没有比简单文件写/读更好的方法呢?

1 个答案:

答案 0 :(得分:3)

假设两个进程都在同一台机器上(或至少在同一架构的机器上),std::time()(来自<ctime>)的结果将为seconds since the Epoch,并且不会需要任何转换:

std::time_t seconds_since_epoch = std::time(NULL);

免责声明:这不是的最佳方法,在撰写时,您需要to lock the file进行阅读,。只是回答这个问题。


更新,发表评论。

如果您需要编写timeval,或许最简单的方法是为<<定义>>timeval运算符,并将这些文本作为文本写入并读取到文件中(无需担心字节排序)按原样(没有转换):

std::ostream& operator <<(std::ostream& out, timeval const& tv)
{
    return out << tv.tv_sec << " " << tv.tv_usec;
}

std::istream& operator >>(std::istream& is, timeval& tv)
{
    return is >> tv.tv_sec >> tv.tv_usec;
}

这将允许您执行以下操作(忽略并发):

// Writer
{
    timeval tv;
    gettimeofday(&tv, NULL);
    std::ofstream timefile(filename, std::ofstream::trunc);
    timefile << tv << std::endl;
}

// Reader
{
    timeval tv;
    std::ifstream timefile(filename);
    timefile >> tv;
}

如果两个进程同时运行,则需要锁定该文件。以下是使用Boost的示例:

// Writer
{
    timeval tv;
    gettimeofday(&tv, NULL);
    file_lock lock(filename);

    scoped_lock<file_lock> lock_the_file(lock);

    std::ofstream timefile(filename, std::ofstream::trunc);
    timefile << tv << std::endl;
    timefile.flush();
}

// Reader
{
    timeval tv;
    file_lock lock(filename);

    sharable_lock<file_lock> lock_the_file(lock);

    std::ifstream timefile(filename);
    timefile >> tv;

    std::cout << tv << std::endl;
}

...为了清楚起见,我省略了exception处理(当文件不存在时);你需要将它添加到任何具有生产价值的代码中。