Chinaunix

标题: 想使用read来实现从文件中读取一行数据的函数 [打印本页]

作者: gooderfeng    时间: 2006-04-18 16:42
标题: 想使用read来实现从文件中读取一行数据的函数
如题,想不到有什么高效的方法.
大家帮帮忙,有没有什么好方法.
作者: wingger    时间: 2006-04-18 16:51
fgets?
作者: gooderfeng    时间: 2006-04-18 17:03
想用
       ssize_t read(int fd, void *buf, size_t count);
来实现读取一行的操作.
作者: cjaizss    时间: 2006-04-18 17:04
不难,自己实现实现?
作者: gooderfeng    时间: 2006-04-18 17:06
是不是一个字节一个字节的读,然后判断是否是\r\n.这样是不是太慢了,也太傻了.
如果读取1000个字节到缓冲,然后在判断有没有\r\n 也很傻呀??
想不出来,有什么好方法来实现那.
或者有什么方法能简单的从open打开的文件handle中读取一行数据.
作者: mike_chen    时间: 2006-04-18 17:07
循环把文件读到一个缓冲里,再把缓冲里的数据以‘\n’为分隔符分开
作者: gooderfeng    时间: 2006-04-18 17:11
循环把文件读到一个缓冲里,再把缓冲里的数据以‘\n’为分隔符分开

还有一个问题.
如果我想知道文件内一共有多少行,是不是无论如何都要遍例这个文件.
很郁闷啊,如果文件很大.
作者: snow888    时间: 2006-04-18 17:19
原帖由 mike_chen 于 2006-4-18 17:07 发表
循环把文件读到一个缓冲里,再把缓冲里的数据以‘\n’为分隔符分开


这个思路有问题,如果文件很大,可能会出现先分配的缓冲不够的现象。

建议楼主看看 vim 的原程序。
作者: mike_chen    时间: 2006-04-18 17:46
原帖由 snow888 于 2006-4-18 17:19 发表


这个思路有问题,如果文件很大,可能会出现先分配的缓冲不够的现象。

建议楼主看看 vim 的原程序。

我好像有说过“循环”吧
作者: mike_chen    时间: 2006-04-18 17:55
循环读,用strtok取,下班了,晚上回去如果有时间就写一个。
作者: gooderfeng    时间: 2006-04-19 17:50
大家帮想想办法,只要办法,不要代码啊。
作者: dlms    时间: 2006-04-19 23:21
read 不是有个参数是长度吗!然后你先把文件的长度得到,在去按长度读啊!
作者: wolf0403    时间: 2006-04-20 00:34
fgets 通过 read 实现。。。1、自己缓冲;2、不缓冲,单字节读取判断。不知道这个东西还能有多少出奇的方法……

分片 mmap 然后用 strstr 搜索 '\r\n' 就更 xx 了……
作者: NewCore    时间: 2007-06-02 13:22
google到这里来的,我也准备实现一个这样的东西儿,看来也没撒花哨可玩...
作者: doctorjxd    时间: 2007-06-02 19:25
C++

getline
作者: doctorjxd    时间: 2007-06-02 19:29

  1. ...
  2.    vector<string> strvect;
  3.         while(!fin.eof())
  4.         {
  5.             string inbuf;
  6.             getline(fin, inbuf,'\n');
  7.             strvect.push_back(inbuf);
  8.         }
  9. ...
复制代码

作者: flw2    时间: 2007-06-02 19:51
哎。
作者: 思一克    时间: 2007-06-02 21:07
一个一个BYTE读判断回车慢. 不行.

全读进来也不行.

最快的方法:
开一个buffer,大小可以是256到1024都可以. 一次read进来buffer大小,
然后调用strchr(buffer, '\n')找.
关键是要用strchr, strcpy, memcpy等FUNCTION, 和一个大一点的缓冲.

[ 本帖最后由 思一克 于 2007-6-2 21:10 编辑 ]
作者: DaYuTou    时间: 2007-06-02 22:30
提示: 作者被禁止或删除 内容自动屏蔽
作者: flw2    时间: 2007-06-02 23:04
fgets就是来干这个的,它比起任何人的方法,时间最多损失在读BUF大小个字节。我的系统下这个缓冲大小是
128k。
如果能保证在<n字节之间,那么读n个字节是最好的,但是这个实在是不在我们的考虑范围之内,而且和文件系统相关,文件系统每个块大小相关。

fgets是通用的
作者: flw2    时间: 2007-06-02 23:05
原帖由 思一克 于 2007-6-2 21:07 发表
一个一个BYTE读判断回车慢. 不行.

全读进来也不行.

最快的方法:
开一个buffer,大小可以是256到1024都可以. 一次read进来buffer大小,
然后调用strchr(buffer, '\n')找.
关键是要用strchr, strcpy, memcp ...

如果行的长度是3-30M,那么这个方法还是很糟糕。肯定没有fgets快。
作者: 思一克    时间: 2007-06-02 23:27
一般情况下,文本文件行长度有最大限度.
你到一个LINUX系统找到所有的文本文件看. 都是如此.

如果一个例外,行长度是许多M字节,那么读入到一个1024的buffer, strchr方式比每个BYTE读比较快的更多.


原帖由 flw2 于 2007-6-2 23:05 发表

如果行的长度是3-30M,那么这个方法还是很糟糕。肯定没有fgets快。





欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2