我正在用 C 编写一个学术项目,我只能使用 <fcntl.h>
和 <unistd.h>
库到文件操作。
我有逐行读取文件的功能。算法是:
- 在文件的开头设置指针并获取当前位置。
- 以恒定大小将数据读取到缓冲区 (
char buf[100]
),逐字符迭代并检测行尾'\n'
. - 增加当前位置:
curr_pos = curr_pos + length_of_read_line;
- 使用
lseek(fd, current_position, SEEK_SET);
将指针指向当前位置
SEEK_SET
- 将指针设置为距文件开头的给定偏移量。在我的伪代码中 current_position
是偏移量。
实际上它工作正常,但我总是将指针从文件开头开始移动 - 我使用 SEEK_SET - 它没有优化。
lseek
也接受参数 SEEK_CUR
- 这是当前位置。如何从指针的当前位置 (SEEK_CUR) 向后移动指针。我尝试设置负偏移量,但没有成功。
最佳答案
从文件中读取数据行的最有效方法通常是读取可能跨越多行的大块数据,处理 block 中的数据行直到到达末尾,从末尾移动任何部分行缓冲区的开始,然后读取另一 block 数据。根据目标系统和要执行的任务,最好读取足够的数据以填充部分行之后剩余的任何空间,或者始终读取字节数的二次方并使缓冲区变大可能更好足以容纳该大小的 block 加上最大长度的部分行(上次读取遗留下来的)。这种方法的一个困难是所有数据都使用同一个缓冲区从流中读取。然而,在可行的情况下,它通常会比使用多次单独调用 fread
获得更好的性能,并且可能比使用 fgets
更好。
虽然标准库函数应该可以促进行输入,但 fgets
的设计是相当不必要的敌意,因为它没有提供读取数据量的方便指示。读取每一行后,想要包含可打印部分的字符串的代码将不得不使用 strlen
来尝试确定读取了多少数据(希望输入不包含任何零字节)然后检查尾随零之前的字节以查看它是否是换行符。不是不可能,但至少很尴尬。如果 fread-and-buffer 方法将满足应用程序的需要,它可能至少与使用 fgets
一样有效,如果不是更高的话,并且由于使用 fgets() 所需的努力
鲁棒性将与使用缓冲方法所需的相媲美,也可以使用后者。
关于C - 使用 lseek 向后移动文件中的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53488645/