Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 取消缓冲符合unicode和跨平台的文件写入_C++_Qt - Fatal编程技术网

C++ 取消缓冲符合unicode和跨平台的文件写入

C++ 取消缓冲符合unicode和跨平台的文件写入,c++,qt,C++,Qt,我正在开发一些加密应用程序,需要进行一些无缓冲文件写入 我不知道我能用什么函数来做这个 说得清楚一点,我正在实现一个写回调函数和一个读回调函数,当操作系统中的任何第三方应用程序想要写入或读取硬盘时,它们将处理写入或读取操作。 需要: -我需要处理具有unicode名称的文件。 -我需要以无缓冲模式写入。 -我需要在Windows、Linux和Mac上这样做 我使用C++和Qt。虽然QFile确实具有在非缓冲模式下打开文件的语法,但文档说它不适用于Windows(也就是说,QFile在Window

我正在开发一些加密应用程序,需要进行一些无缓冲文件写入

我不知道我能用什么函数来做这个

说得清楚一点,我正在实现一个写回调函数和一个读回调函数,当操作系统中的任何第三方应用程序想要写入或读取硬盘时,它们将处理写入或读取操作。

需要:
-我需要处理具有unicode名称的文件。
-我需要以无缓冲模式写入。
-我需要在Windows、Linux和Mac上这样做

<>我使用C++和Qt。虽然QFile确实具有在非缓冲模式下打开文件的语法,但文档说它不适用于Windows(也就是说,QFile在Windows中始终处于缓冲模式)

这会导致我的应用程序因Windows延迟写入错误而崩溃。理想情况下,我不想为每种类型的操作系统使用单独的函数(+lib),但我意识到,在寻求跨平台兼容性时,我的选项可能不是很好。无论如何,如果没有一个平台可以为所有3个平台提供这些功能,我期待着就每个平台应该使用哪些功能提出建议

  • 对于Windows,您需要具有
    FILE\u FLAG\u NO\u缓冲的函数
  • 在Linux上,您需要使用带有
    O_DIRECT
    选项的
    open()
    ,但请注意,它仅从2.4.10内核开始受支持
  • 在OSX上,您需要在每次写入后调用
但我必须警告您,无缓冲I/O并不会使磁盘I/O最小化,而且极有可能会严重降低应用程序的性能。除非您真的知道自己在做什么,知道操作系统缓冲是如何影响性能的,并且清楚地解释了为什么无缓冲I/O会更快,否则不要进行直接I/O。如果您仍然想继续,请不要忘记在测试前后衡量性能。你进行错误优化,甚至让事情变得更糟的几率是十分之九

至于Unicode法规遵从性,这无关紧要。写入需要一个内存地址和若干字节来写入。您可以编写unicode、ASCII、任何二进制数据等。如果使用unicode,您只需记住不要混淆字符串长度和字符串大小


祝你好运

你说的无缓冲是什么意思?用户空间中没有缓冲区?操作系统没有缓冲?HDD没有缓冲?所谓无缓冲,我的意思是写操作应该尽快进行,而不需要将写请求集中到缓冲区中,以期最大限度地减少I/o。当我调用write时,我需要它真正地写入硬盘。因此,在这方面,我想跳过所有可以跳过的缓冲区。也许我不能跳过硬盘的问题,但那可能没问题。我不希望操作系统延迟写入。谢谢弗拉德。我会试试你的建议。我很快地发表了一些评论。关于unicode,我知道我写什么并不重要,当我说unicode兼容时,我的意思是我打开的文件的名称有一个unicode名称。因此,如果open函数不支持unicode字符,它将无法打开该文件(获取该文件的句柄),以便我可以对其进行写入。例如,fstream::open()无法打开具有unicode文件名的文件。这就是你为Linux建议的“open()”吗?@user440297:不,你说的是包装器。我对他们不是很熟悉
open()
是POSIX系统调用。无论您使用什么,它都会在一天结束时调用
open()
,以打开一个文件。是否支持Unicode,也取决于文件系统驱动程序。例如,OSXHFS支持它,但仍有其局限性。在Linux中,unicode在整个开箱即用系统中都受支持,无需编写任何特殊代码,因此您根本不必担心它。然而,Windows是一个例外。有
CreateFile
函数,它有两个等价项