我需要做的是使用unistd.h中的read函数逐行读取文件。我现在有这样的想法:
n = read(fd, str, size);
但是,这将读取到文件的末尾,或最大字节数。有没有办法让它一次读一行,在换行处停下来?这些线都是可变长度的。
我只允许这两个头文件:
#include <unistd.h>
#include <fcntl.h>
本练习的重点是逐行读取文件,并在读取时输出每一行。基本上,是为了模仿fgets()和fput()函数。
发布于 2010-02-28 04:05:06
您可以将一个字符接一个字符地读入缓冲区并检查换行符(适用于Windows的\r\n
和适用于Unix系统的\n
)。
发布于 2010-02-28 04:49:58
您需要创建一个长度为所支持的最长行长度的两倍的缓冲区,并且需要跟踪缓冲区状态。
基本上,每次调用新行时,您都会从当前的缓冲区位置扫描,以查找行尾标记。如果你找到了,很好,这就是你的台词。更新你的缓冲区指针并返回。
如果达到最大长度,则返回一个截断的行,并将状态更改为discard。下次你被调用时,你需要丢弃到下一个行尾,然后进入你的正常读状态。
如果你读到了最后的内容,那么你需要读入另一个maxline字符,如果你读到了底部(也就是,你可能需要进行两次读调用),就换行到缓冲区的开头,然后继续扫描。
以上所有操作都假设您可以设置最大行长度。如果不能,那么您必须使用动态内存,并担心如果缓冲区malloc失败会发生什么。此外,您还需要始终检查读取结果,以防在读取缓冲区时遇到文件末尾。
发布于 2010-02-28 04:43:49
不幸的是,read函数并不真正适合这种类型的输入。假设这是面试/家庭作业/练习中的某种人为要求,您可以尝试模拟基于行的输入,方法是以块为单位读取文件,并自己在换行符上拆分它,在调用之间以某种方式保持状态。如果仔细记录函数的用法,您可以使用静态位置指示器。
https://stackoverflow.com/questions/2348747
复制相似问题