10

我想找到没有缓冲区的低级 C/C++ API,相当于 linux 系统中的“write”。有吗?

fread、fwrite 等缓冲 I/O 不是我想要的。

4

5 回答 5

15

使用 FILE_FLAG_NO_BUFFERING 选项查看CreateFile

于 2009-03-31T14:25:14.580 回答
5

http://www.codeproject.com/Articles/51678/Improve-responsiveness-in-Windows-with-the-FILE_FL

防止换出缓存的唯一方法是打开带有FILE_FLAG_NO_BUFFERING标志的文件。然而,这要求磁盘 I/O 请求的大小可以被扇区大小(512 到 4096 字节)整除,这需要对大多数依赖于能够请求不同大小的应用程序进行大量重写。

该项目包含一个插入式包装器,它提供CreateFile_NB()ReadFile_NB()WriteFile_NB()CloseHandle_NB()函数,这些函数负责在关闭打开写入的文件时进行排队和调整文件大小。

http://msdn.microsoft.com/en-us/library/cc644950(v=vs.85).aspx

当使用 CreateFile 函数打开或创建文件时,FILE_FLAG_NO_BUFFERING可以指定标志来禁用系统缓存正在读取或写入文件的数据。尽管这可以完全直接地控制数据 I/O 缓冲,但对于文件和类似设备,必须考虑数据对齐要求。

于 2012-11-09T20:38:20.683 回答
4

POSIX write() 函数的 Win32 等效项是WriteFile(). 该文档建议使用非缓冲文件 I/O,并推荐此页面以获取更多信息。

于 2009-03-31T14:26:21.630 回答
2

流大约是您可以获得的最低级别..并且它们可以是无缓冲的。

int setvbuf(
   文件*流,
   字符 * 缓冲区,
   整数模式,
   size_t 大小
);

例子

  setvbuf(stdout, (char *)NULL, _IONBF, 0); //无缓冲的标准输出

这是 vc2008 帮助文档的摘录。

setvbuf 函数允许程序控制流的缓冲和缓冲区大小。stream 必须引用自打开后未进行 I/O 操作的打开文件。buffer 指向的数组用作缓冲区,除非它为 NULL,在这种情况下 setvbuf 使用自动分配的长度为 size/2 * 2 字节的缓冲区。

模式必须是_IOFBF_IOLBF_IONBF。如果 mode 是_IOFBF_IOLBF,则 size 用作缓冲区的大小。如果 mode 为 _IONBF,则流是无缓冲的,并且忽略大小和缓冲区。mode 的值及其含义是:

_IOFBF 全缓冲;即buffer作为缓冲区,size作为缓冲区的大小。如果缓冲区为 NULL,则使用自动分配的缓冲区大小字节长。

_IOLBF 对于某些系统,这提供了行缓冲。但是,对于 Win32,行为与 _IOFBF - Full Buffering 相同。

_IONBF 不使用缓冲区,无论缓冲区或大小如何。

于 2009-03-31T14:19:18.607 回答
2

您可以使用_write MSDN Page Here

于 2009-03-31T14:40:55.417 回答