C++ 如何在C+中使用read()和O#u DIRECT读取文件+;在Linux上?

C++ 如何在C+中使用read()和O#u DIRECT读取文件+;在Linux上?,c++,linux,file,C++,Linux,File,我正在寻找解决上述问题的方法 这是我的“不工作代码”。charsInCurrentBuffer始终返回-1 #define BUFSIZE 512 char *bufferA = new char[BUFSIZE]; char *bufferB = new char[BUFSIZE]; const char *inputFile = "in.txt"; if ( (fdInputFile = open(inputFile, O_DIRECT) ) != -1) { cout <

我正在寻找解决上述问题的方法

这是我的“不工作代码”。charsInCurrentBuffer始终返回-1

#define BUFSIZE 512

char *bufferA = new char[BUFSIZE];
char *bufferB = new char[BUFSIZE];

const char *inputFile = "in.txt";

if ( (fdInputFile = open(inputFile, O_DIRECT) ) != -1) {
    cout << "input opened!" << endl;
} else {
    cout << "can't open input file!";
}

int charsInCurrentBuffer = read(fdInputFile, currBuffer, BUFSIZE);
cout << charsInCurrentBuffer << endl;
#定义BUFSIZE 512
char*bufferA=新字符[BUFSIZE];
char*bufferB=新字符[BUFSIZE];
const char*inputFile=“in.txt”;
如果((fdInputFile=open(inputFile,O_DIRECT))!=-1){

cout当您从
O_DIRECT
fd中
读取时,“用户缓冲区和文件偏移量的对齐方式必须是Linux上文件系统逻辑块大小的倍数”(引用自)。其他环境可能对此有不同的限制,实际上它依赖于文件系统

new
通常不会出现这种情况(除非你运气好)

<>你应该考虑使用<代码> PosixyMaMeLime<代码>函数,如果你的平台有,或者简单地分配一个更大的缓冲区(块大小+BufSead),并使用它的块大小对齐的部分。 如果您想坚持使用
new
,您需要使用某种形式的新布局,并结合上述内容,但我对这一点还不太熟悉,无法说明它是如何工作的


如需参考,请参阅本手册或上述手册页的注释部分。

read
返回-1 on error,因此您可能会向我们显示
errno
哦,很抱歉:errno返回EINVAL(22)“无效参数”,但参数似乎是正确的:(事实上,
man2open
O_DIRECT
NOTES
部分中说:
O_DIRECT标志可能会对用户空间缓冲区的长度和地址以及I/O的文件偏移量施加对齐限制。在Linux中,对齐限制因文件系统和内核版本而异,可能完全没有。但是目前,应用程序没有独立于文件系统的接口来发现给定文件或文件系统的这些限制。
。应该注意的是,自Linux 2.6以来,事情变得更容易了:“在Linux 2.4下,传输大小、用户缓冲区和文件偏移量的对齐方式都必须是文件系统逻辑块大小的倍数。在Linux 2.6下,对齐512字节边界就足够了。”()