C++ QT QIODevice等效于;a和x2B&引用;(读取,但仅附加)

C++ QT QIODevice等效于;a和x2B&引用;(读取,但仅附加),c++,qt,fopen,C++,Qt,Fopen,我们有一个非常高性能的应用程序,或者更准确地说,一个需要写入日志文件的可伸缩应用程序 每个实例都有自己的日志文件,但在查看性能指标时,我们偶尔会看到非常慢的写入时间。日志文件将被放到一个共享磁盘上,这样我们就可以在后台运行的虚拟机(带着它的磁盘)离开时查看日志 在通过云提供商执行此操作时,他们建议日志文件应按以下方式以“a+”模式打开: “a+”追加/更新:打开文件进行更新(输入和输出) 所有输出操作都在文件末尾写入数据。 重新定位操作(fseek、fsetpos、rewind)会影响下一个 输

我们有一个非常高性能的应用程序,或者更准确地说,一个需要写入日志文件的可伸缩应用程序

每个实例都有自己的日志文件,但在查看性能指标时,我们偶尔会看到非常慢的写入时间。日志文件将被放到一个共享磁盘上,这样我们就可以在后台运行的虚拟机(带着它的磁盘)离开时查看日志

在通过云提供商执行此操作时,他们建议日志文件应按以下方式以“a+”模式打开:

“a+”追加/更新:打开文件进行更新(输入和输出) 所有输出操作都在文件末尾写入数据。 重新定位操作(fseek、fsetpos、rewind)会影响下一个 输入操作,但输出操作将位置移回 文件结束。如果文件不存在,则创建该文件

这允许共享磁盘资源缓存写操作;显然,“只写”模式不行,这就是我们的问题——数千个客户机,每个客户机都必须在下一个客户机写入其日志文件之前保存到磁盘

我找不到与QIODevice的开放标志类似的东西。我所能做的就是读/写,这与a+不同


在QT中是否有更好的方法打开“仅追加但可读取缓存”的文件?

这是将QIODevice::OpenMode转换为类似unix的OSs的stdio标志的函数
我不确定它是否将
QIODevice::ReadWrite | QIODevice::Append
转换为
“a+”
,但它是:

static inline int openModeToOpenFlags(QIODevice::OpenMode mode)
{
    int oflags = QT_OPEN_RDONLY;
#ifdef QT_LARGEFILE_SUPPORT
    oflags |= QT_OPEN_LARGEFILE;
#endif
    if ((mode & QFile::ReadWrite) == QFile::ReadWrite)
        oflags = QT_OPEN_RDWR;
    else if (mode & QFile::WriteOnly)
        oflags = QT_OPEN_WRONLY;
    if (QFSFileEnginePrivate::openModeCanCreate(mode))
        oflags |= QT_OPEN_CREAT;
    if (mode & QFile::Truncate)
        oflags |= QT_OPEN_TRUNC;
    if (mode & QFile::Append)
        oflags |= QT_OPEN_APPEND;
    if (mode & QFile::NewOnly)
        oflags |= QT_OPEN_EXCL;
    return oflags;
}

下面是完整的源代码:

没有做您想要做的事情?有一个细微的区别。ReadWrite允许您尽可能地更新文件的“前端”部分。a+的想法是“只写,但缓存写”。无论如何,这是我正在尝试的最接近的。除非我们再做一次压力测试,否则很难说它是否有效。