当前位置: 首页 > 面试题库 >

如何在Linux上的C ++中使用read()和O_DIRECT读取文件?

冯嘉珍
2023-03-14
问题内容

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

这是我的“无效代码”。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;

问题答案:

当你readO_DIRECTFD中,“用户的定位缓冲区和文件偏移都必须是文件系统的逻辑块大小的倍数”(引自open手册页在Linux上)。其他环境对此可能有不同的约束,并且实际上是依赖于文件系统的。

new通常情况并非如此(除非您很幸运)。

posix_memalign如果平台具有该功能,则应考虑使用该功能,或者只是分配一个更大的缓冲区(BLOCK_SIZE +
BUFSIZE),然后使用该功能的块大小对齐部分。

如果您要坚持使用new,则需要结合上面的内容使用某种形式的new布局,但是我对此并不十分熟悉,无法展示其工作原理。

作为参考,例如,请参见LKML上的该线程,或上面引用的手册页的“注释”部分。



 类似资料:
  • 问题内容: 我使用vfat驱动程序将FAT文件系统安装在Linux中。我想知道如何读取文件的vfat属性,例如“隐藏”和“只读”。 根据到目前为止的读物,如果我在文件上使用glibc命令,则只会得到此处列出的文件属性:http : //www.gnu.org/s/libc/manual/html_node/Attribute -Meanings.html#Attribute- Meanings 但

  • 问题内容: 我正在做一些图像处理,我想分别读取JPEG和PNG图像中的每个像素值。 在我的部署方案中,使用第3方库对我来说很尴尬(因为我对目标计算机的访问受到限制),但是我假设没有用于读取JPEG / PNG的标准C或C ++库… 因此,如果您知道 不 使用库的方法,那就太好了,如果没有,那么仍然欢迎回答! 问题答案: C标准中没有标准库可以读取文件格式。 但是,大多数程序,尤其是在Linux平台

  • 问题内容: 是否有使用C 读取用于Linux的INI文件等配置的标准方法? 我正在基于Linux的手持设备上工作,并用C编写代码。 否则,我想知道其他选择。 最终更新: 我已经探索甚至使用过LibConfig。但是占用空间很大,而且我的用法太简单了。因此,为了减少占用空间,我推出了自己的实现。该实现不是太通用,实际上到目前为止已经相当耦合了。启动应用程序时,配置文件将被解析一次,并设置为一些全局变

  • 问题内容: 我使用G ++中的标准 ftell 和 fseek 选项 遇到 整数溢出,但是我想我错了,因为似乎 ftell64 和 fseek64 不可用。我一直在搜索,很多网站似乎都使用 lseek 和 off64_t 数据类型进行引用,但是我还没有找到任何引用等于 fseek的 示例。现在,我正在读取的文件是16GB + CSV文件,期望至少翻倍。 没有任何外部库,最简单的方法来实现与 fse

  • 我的数据位于azure cosmos数据库中,我已经将数据集挂载到azure Databricks上。 我可以使用pandas读取csv文件,并将其加载到spark DataFrame中。

  • 问题内容: 我希望用户上传一个.csv文件,然后让浏览器能够解析该文件中的数据。我正在使用ReactJS。这将如何运作?谢谢。 问题答案: 弄清楚了。的组合反应文件阅读器和HTML5的的FileReader(见本页)。 将react-file-reader位放在render内部: 然后在上面。