问题标签 [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.
linux - 在Linux中写入文件而不填零
假设目的是在运行 Linux 的嵌入式设备上创建一个开头有一个大洞的文件,稍后我们将写入该文件。我们打开文件,获取文件描述符并调用lseek
它来寻找某个已知位置。之后,当我们想在寻找到的位置写入该文件时,我们调用write
它。
但是,在第一次写入时,通过查找创建的空洞会被零填充,如果空洞足够大,此操作可能需要一些时间。在我的应用程序中,不需要这种零初始化,因为孔的长度是准确的,稍后我将用我的数据填充它。
有没有办法避免在零填充漏洞write
后进行第一次调用seek
(即使它涉及修改文件系统驱动程序)?或者,有没有办法在文件开头(附加到文件的前面)之前写入文件?
c - lseek() 的返回值
我对lseek()
' 的返回值感到困惑(这是新文件偏移量)
我有文本文件(它的名字是 prwtest)。其内容被写入 a 到 z。
而且,我写的代码如下,
在 line number17
上,我使用 flag O_APPEND
,因此 prwtest 的当前文件偏移量取自 i-node 的当前文件大小。(现在是 26 岁)。
在行号18
上,我使用lseek()
SEEK_CUR 使用的行号,偏移量为 0。
但是结果值为cur_offset
0。(我假设它必须是 26,因为 SEEK_CUR 表示当前文件偏移量。)但是,SEEK_END
给了我我的想法,cur_offset
是 26。
为什么lseek(fd, 0, SEEK_CUR);
给我返回值 0,而不是 26?
c - 使用 lseek() read() 和 write() 处理文件时遇到问题
我在我的大学里研究 C,我刚开始使用缓冲区和这个函数,所以我很抱歉我缺乏知识,我可能会表现出来。我必须使用 lseek()、write() 和 read() 来完成这个项目。我想读取一个文件,我发现每个字母“a”都会将其更改为“?”。到目前为止,我的代码是:
但这改变了第一个“a”(最后一个,因为我从头开始),仅此而已。它停止变化。哦,它不会改变'a',改变之后的字母,但这与缓冲运动有关,对吧?我以后可能会考虑..我只是想知道为什么这不会读取所有文件并更改所有内容,它会在第一次发现时停止。
c - 如何使用缓冲区和 lseek 更改文件中的某些字母
我在使用 lseek 和缓冲区进行分配时遇到了一些麻烦。目标是读取文件并将每个字母“a”更改为“?”。我正在运行一些小程序来了解函数和缓冲区的工作原理,但我遇到了一些麻烦。想象一下我的文件“teste”中只有“abcabcabc”。如果我这样做:
我进入我的控制台“a”,所以第一个字母读得很好,因为我把指针指向了开头。但是,如果我在 printf 之前执行 if 条件,则将 buf 与“a”进行比较,例如:
它不起作用,它不打印任何东西,所以它不进入 if 语句。我需要将缓冲区与字母进行比较,这样我就可以更改文件的所有“a”。我该怎么做伙计们?
好的,由于下面的答案,这部分已经解决了,但现在我正在尝试读取所有文件并将每个字符与“a”进行比较,制作一个简单的 printf 只是为了看看它是否工作......我写了这个:
但它现在正在工作..它只打印一个'a',然后不关闭也不做任何事情..它就像一个无限循环但没有进入if语句。怎么了?
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)
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
吗?
append - lseek 不适用于文件的附加模式
这是我的代码。它打开作为参数给出的文件,并且应该在文件开头从控制台写入所有内容。该文件以附加模式打开,然后使用 lseek 将描述符移动到开头。f1 的值没有变化,不是打印 lseek failed 。
c - 如何正确使用 lseek() 来扩展文件大小?
我试图lseek()
在创建所需大小的文件时真正理解使用。所以我编写了这段代码,其唯一目标是创建一个输入中给定大小的文件。
运行例如:
我希望它创建一个名为myFile
5 个字节的文件,其最后一个字节被数字 5 占据。我得到的是一个我什至无法访问的文件。怎么了?我是否错误地解释了lseek()
用法?
c++ - 尝试使用文件描述符从文件中读取打印数字和斜杠到控制台
我正在尝试编写一个简单的程序,通过封装函数来读取文件,如open
, lseek
, pread
.
我的测试文件包含:
我尝试从文件中读取偏移量为 10 的 20 个字节的主要函数:
主要使用的功能的实现:
我的主要功能将其打印到控制台:
我希望它从文件本身打印一些值,而不是一些代表我不太理解的数字和斜线。为什么会这样?