unistd.h read()函数:如何逐行读取文件?

时间:2010-02-27 20:00:39

标签: c unix

我需要做的是使用unistd.h中的read函数来读取文件 逐行。我现在有这个:

n = read(fd, str, size);

但是,这会读到文件的末尾,或者最大为字节数。 有没有办法让我一次读一行,停在新行? 这些行都是可变长度的。

我只允许这两个头文件:

#include <unistd.h>
#include <fcntl.h>

练习的目的是逐行读取文件,并且 在读入时输出每一行。基本上,模仿fgets() 和fputs()函数。

7 个答案:

答案 0 :(得分:7)

您可以逐个字符地读取缓冲区并检查换行符号(Windows的\r\n和Unix系统的\n

答案 1 :(得分:4)

您需要创建两倍于您支持的最长行的长度的缓冲区,并且您需要跟踪缓冲区状态。

基本上,每次要求换行时,都会从当前缓冲区位置扫描,寻找行尾标记。如果你找到一个好的,那就是你的路线。更新缓冲区指针并返回。

如果达到maxlength,则返回截断的行并将状态更改为discard。下次调用时,您需要丢弃到下一行,然后输入正常读取状态。

如果你读到了所读内容的结尾,那么你需要读入另一个maxline字符,如果你触到底部则包装到缓冲区的开头(即,你可能需要进行两次读取调用)然后继续扫描。

以上所有假设您可以设置最大行长度。如果你不能那么你必须使用动态内存并担心如果缓冲区malloc失败会发生什么。此外,如果您在读取缓冲区时遇到文件末尾,则需要始终检查读取结果。

答案 2 :(得分:1)

不幸的是,read函数并不适合这种输入。假设这是面试/家庭作业/练习中的某种人为要求,您可以尝试通过以块为单位读取文件并在换行符上自行分割来模拟基于行的输入,在调用之间以某种方式维持状态。如果您仔细记录功能的使用,您可以使用静态位置指示器。

答案 3 :(得分:1)

答案 4 :(得分:0)

这是一个很好的问题,但只允许读取功能无济于事! :P

循环读取调用以获取固定数量的字节,并搜索'\ n'字符,然后返回字符串的一部分(直到'\ n'),并将其余部分(除了'\ n')存储到前置到下一个字符文件块。

使用动态内存。

缓冲区的大小越大,使用的读取调用越少(这是一个系统调用,所以没有便宜但现在有抢占式内核)。

...

或者只是修改最大行长度,并使用fgets,如果你需要快速...

答案 5 :(得分:0)

如果您以文本模式打开文件,则在读取文件时,Windows“\ r \ n”将以静默方式转换为“\ n”。

如果你在Unix上,你可以使用非标准的 1 gcc'getline()'函数。


1 getline()函数是POSIX 2008的标准功能。

答案 6 :(得分:0)

好吧,它将从终端逐行读取。

您有一些选择:

  • 编写一个在数据用完时使用read但只能一次向调用者返回一行的函数
  • 使用库中完全相同的功能:fgets()
  • 一次只读一个字节,所以你不要走得太远。