问题标签 [lseek]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
1367 浏览

linux - 在Linux中写入文件而不填零

假设目的是在运行 Linux 的嵌入式设备上创建一个开头有一个大洞的文件,稍后我们将写入该文件。我们打开文件,获取文件描述符并调用lseek它来寻找某个已知位置。之后,当我们想在寻找到的位置写入该文件时,我们调用write它。

但是,在第一次写入时,通过查找创建的空洞会被零填充,如果空洞足够大,此操作可能需要一些时间。在我的应用程序中,不需要这种零初始化,因为孔的长度是准确的,稍后我将用我的数据填充它。

有没有办法避免在零填充漏洞write后进行第一次调用seek(即使它涉及修改文件系统驱动程序)?或者,有没有办法在文件开头(附加到文件的前面)之前写入文件?

0 投票
3 回答
2354 浏览

c - lseek() 的返回值

我对lseek()' 的返回值感到困惑(这是新文件偏移量)

我有文本文件(它的名字是 prwtest)。其内容被写入 a 到 z。

而且,我写的代码如下,

在 line number17上,我使用 flag O_APPEND,因此 prwtest 的当前文件偏移量取自 i-node 的当前文件大小。(现在是 26 岁)。

在行号18上,我使用lseek()SEEK_CUR 使用的行号,偏移量为 0。

但是结果值为cur_offset0。(我假设它必须是 26,因为 SEEK_CUR 表示当前文件偏移量。)但是,SEEK_END给了我我的想法,cur_offset是 26。

为什么lseek(fd, 0, SEEK_CUR);给我返回值 0,而不是 26?

0 投票
2 回答
1478 浏览

c - 在C中以相反的顺序将字节从一个文件复制到另一个文件

在此处检查答案并在我的环境中运行它后,我发现代码仍然遇到与我的代码相同的问题。这个问题是,每当我有一个与此类似的输入文件时......

我在目标文件中生成了额外的换行符空格。

调试我的代码后,我可以看到 '\n' 被复制到目标文件中两次,我想了解为什么 lseek 这样做。

附上我的代码。有问题的关键部分在 do/while 循环中。我很确定我的思考过程是正确的,因为我查找的这个答案中的代码会输出完全相同的结果。

0 投票
1 回答
1672 浏览

c - 使用 lseek() read() 和 write() 处理文件时遇到问题

我在我的大学里研究 C,我刚开始使用缓冲区和这个函数,所以我很抱歉我缺乏知识,我可能会表现出来。我必须使用 lseek()、write() 和 read() 来完成这个项目。我想读取一个文件,我发现每个字母“a”都会将其更改为“?”。到目前为止,我的代码是:

但这改变了第一个“a”(最后一个,因为我从头开始),仅此而已。它停止变化。哦,它不会改变'a',改变之后的字母,但这与缓冲运动有关,对吧?我以后可能会考虑..我只是想知道为什么这不会读取所有文件并更改所有内容,它会在第一次发现时停止。

0 投票
2 回答
597 浏览

c - 如何使用缓冲区和 lseek 更改文件中的某些字母

我在使用 lseek 和缓冲区进行分配时遇到了一些麻烦。目标是读取文件并将每个字母“a”更改为“?”。我正在运行一些小程序来了解函数和缓冲区的工作原理,但我遇到了一些麻烦。想象一下我的文件“teste”中只有“abcabcabc”。如果我这样做:

我进入我的控制台“a”,所以第一个字母读得很好,因为我把指针指向了开头。但是,如果我在 printf 之前执行 if 条件,则将 buf 与“a”进行比较,例如:

它不起作用,它不打印任何东西,所以它不进入 if 语句。我需要将缓冲区与字母进行比较,这样我就可以更改文件的所有“a”。我该怎么做伙计们?

好的,由于下面的答案,这部分已经解决了,但现在我正在尝试读取所有文件并将每个字符与“a”进行比较,制作一个简单的 printf 只是为了看看它是否工作......我写了这个:

但它现在正在工作..它只打印一个'a',然后不关闭也不做任何事情..它就像一个无限循环但没有进入if语句。怎么了?

0 投票
1 回答
734 浏览

linux - 自定义 SPI 驱动实现 lseek

我正在尝试为自定义硬件实现 SPI 驱动程序。我从 spidev 驱动程序的副本开始,它支持几乎所有我需要的东西。

我们使用的协议包含三个部分:命令位(读/写)、地址和任意数量的数据。

我曾假设简单地添加 lseek 功能将是做到这一点的最佳方式。“寻找”到所需的地址,然后读取或写入任意数量的字节。我在新驱动程序的 file_operations 中创建了一个自定义 .llseek,但我从未见过该函数被调用过。我尝试过使用 fseek()、lseek() 和 pread(),但这些函数似乎都没有调用新的 my_lseek() 函数。每个呼叫都报告“errno 29 ESPIPE Illegal Seek”

该设备在 board.c 文件中定义:

我怀疑开发文件的创建方式可能有些问题,主要是因为我找到的示例引用了 filp->f_pos

所以我的问题是:有没有办法让这个驱动程序(轻微修改的 spidev)支持“seek”调用?这在什么时候被定义为返回 errno 29?我是否必须从新驱动程序开始,并且不能依赖 spi_board_info() 和 spi_register_board_info() 设置?

/drivers/spi 目录 (spi-dw) 中只有一个驱动程序引用 lseek,它们使用 default_llseek 实现。我们想出了一些“技巧”来让一切正常运行,但我倾向于学习以正确的方式完成它。

任何建议都非常感谢!(PS,OMAP安卓系统内核版本为3.4.48)

0 投票
1 回答
549 浏览

c - 文件锁定 + Fscanf/Lseek

我有一个名为“input.txt”的文件,其中包含一些值。我正在编写将在该文件中找到最小值的程序,并将该最小值替换为作为命令行参数给出的数字 - 如果该命令行参数大于最小值。这些值代表室温,因此可以使用事实来找到最小值。此外,需要锁定文件的那部分(新数字替换最小值)。

例子:

文件:21 25 19 22 24

文件:21 25 23 22 24

文件:21 25 23 22 24

文件:29 25 23 22 24

代码:

然而这不起作用。文件不会改变。问题是 - 我知道这是正确的方法。我编写了基本相同的程序,例如将单词"aa"的每次出现都更改为"bb"。它基本上是相同的概念。

我试过了:

  • 我试过fscanf()while()循环之前和之后获取偏移量。在第一个fscanf偏移量设置为 0 之前 - 文件的开头。在第一个fscanf偏移量设置为文件末尾之后,每次迭代后偏移量都保留在文件末尾。
  • 我试过ftell()在这些相同的地方使用printf()ftell() 给我正确的偏移量。然而,ftell()在 while 循环中仍然给出了文件的结尾。我也尝试过使用fseek()而不是 lseek()(即使我知道在其实现中fseek()使用lseek())。还是一样的结果。
  • 我试过使用char*缓冲区而不是值。基本上要使用 fscanf(file,"%s",buffer),转换该值以检查读取值是否最小,然后我习惯于 fprintf(file,"%s",buffer)编写它。然而同样的结果。
  • 我试过锁定整个文件(我想 - 也许有问题),但是,同样的结果。

代码:

这是我提到的第二个使用相同概念的程序。此代码有效,但我也尝试在这里打印偏移量,并且偏移量也在文件末尾。

如您所见,这是完全相同的概念。第二个程序有效,第一个无效。

我现在很困惑。如果我从文件流创建文件描述符,然后lseek()在该文件描述符上使用来更改偏移量,流的偏移量也会改变吗?如果您使用fscanf()从流中读取某些内容,是否offset_t会像从文件中读取一样多地进行更改?如果我fscanf()与格式说明符%d和一起使用,更改偏移量有什么区别%s吗?

0 投票
1 回答
675 浏览

append - lseek 不适用于文件的附加模式

这是我的代码。它打开作为参数给出的文件,并且应该在文件开头从控制台写入所有内容。该文件以附加模式打开,然后使用 lseek 将描述符移动到开头。f1 的值没有变化,不是打印 lseek failed 。

0 投票
2 回答
2552 浏览

c - 如何正确使用 lseek() 来扩展文件大小?

我试图lseek()在创建所需大小的文件时真正理解使用。所以我编写了这段代码,其唯一目标是创建一个输入中给定大小的文件

运行例如:

我希望它创建一个名为myFile5 个字节的文件,其最后一个字节被数字 5 占据。我得到的是一个我什至无法访问的文件。怎么了?我是否错误地解释了lseek()用法?

0 投票
1 回答
62 浏览

c++ - 尝试使用文件描述符从文件中读取打印数字和斜杠到控制台

我正在尝试编写一个简单的程序,通过封装函数来读取文件,如open, lseek, pread.

我的测试文件包含:

我尝试从文件中读取偏移量为 10 的 20 个字节的主要函数:

主要使用的功能的实现:

我的主要功能将其打印到控制台:

我希望它从文件本身打印一些值,而不是一些代表我不太理解的数字和斜线。为什么会这样?