首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >unistd.h read()函数:如何逐行读取文件?

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

Stack Overflow用户
提问于 2010-02-28 04:00:39
回答 7查看 19.8K关注 0票数 12

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

代码语言:javascript
运行
复制
n = read(fd, str, size);

但是,这将读取到文件的末尾,或最大字节数。有没有办法让它一次读一行,在换行处停下来?这些线都是可变长度的。

我只允许这两个头文件:

代码语言:javascript
运行
复制
#include <unistd.h>
#include <fcntl.h>

本练习的重点是逐行读取文件,并在读取时输出每一行。基本上,是为了模仿fgets()和fput()函数。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2010-02-28 04:05:06

您可以将一个字符接一个字符地读入缓冲区并检查换行符(适用于Windows的\r\n和适用于Unix系统的\n )。

票数 7
EN

Stack Overflow用户

发布于 2010-02-28 04:49:58

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

基本上,每次调用新行时,您都会从当前的缓冲区位置扫描,以查找行尾标记。如果你找到了,很好,这就是你的台词。更新你的缓冲区指针并返回。

如果达到最大长度,则返回一个截断的行,并将状态更改为discard。下次你被调用时,你需要丢弃到下一个行尾,然后进入你的正常读状态。

如果你读到了最后的内容,那么你需要读入另一个maxline字符,如果你读到了底部(也就是,你可能需要进行两次读调用),就换行到缓冲区的开头,然后继续扫描。

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

票数 4
EN

Stack Overflow用户

发布于 2010-02-28 04:43:49

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2348747

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档