首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 一年前的一个被问了两次的面试题:怎样快速定位到文件的最后一行?我到现在为止还不知道面试官的真实意图。 [已结贴,结贴人:bbspeterlee]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • bbspeterlee
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 揭帖率:
    发表于:2008-05-29 14:48:15 楼主
    一年前的一个被问了两次的面试题:怎样快速定位到文件的最后一行?我到现在为止还不知道面试官的真实意图。

    我唯一能想到的就是,把文件指针地位到最后一行(fseek(fp, 0L, SEEK_END),然后向前扫描换行符(倒退两个字符读一个字符),实在想不出有什么好办法了。是不是我理解错了?
    (当时我这样回答时,面试官问我有没有更快的,我说没有,还请指教。不过他就是不肯告诉我,郁闷!)

    另外什么叫随机文件?跟这个面试题目有什么关系吗?
    20  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • jieao111
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-29 14:51:041楼 得分:1
    以附加方式打开是不是直接是最后一行
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • k2eats
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-29 15:42:022楼 得分:5
    fseek(fp, 0L, SEEK_END)没错啊!
    计算机的数据文件按其数据的存放方式,分为3种:
        顺序型:用于连续存放的文本数据
        随机型:用于有固定长度记录结构的文本数据或二进制数据
        二进制型:用于二进制数据
    顺序文件即普通的文本文件,它是一个接一个的顺序排列,要查找一个数据时,必须从头一个一个的读取直到找到要找的位置,所以无法灵活的随意存取
    随机文件的每一个记录都有固定的长度,每一个记录都有一个记录号,在存入数据时,只需指明实地几个记录号就可以把数据存入指定的位置,比较灵活
    由以上定义就知道了,呵呵!!!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • panthenia
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-29 15:52:453楼 得分:2
    个人同意二楼的想法,直接以追加的方式打开,然后在向前读文件
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • bysdy
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-29 16:27:334楼 得分:1
    引用 1 楼 jieao111 的回复:
    以附加方式打开是不是直接是最后一行

    学习了~~
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • mymtom
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 2

    发表于:2008-05-29 16:34:335楼 得分:0
    vi里用G命令
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • mymtom
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 2

    发表于:2008-05-29 16:51:366楼 得分:2
    引用楼主 bbspeterlee 的帖子:
    一年前的一个被问了两次的面试题:怎样快速定位到文件的最后一行?我到现在为止还不知道面试官的真实意图。

    我唯一能想到的就是,把文件指针地位到最后一行(fseek(fp, 0L, SEEK_END),然后向前扫描换行符(倒退两个字符读一个字符),实在想不出有什么好办法了。是不是我理解错了?
    (当时我这样回答时,面试官问我有没有更快的,我说没有,还请指教。不过他就是不肯告诉我,郁闷!)

    另外什么叫随机文件?跟这个面试题…

    方法很多的。
    可以用内存映射文件(比如Linux下的mmapWindows下用内存映射文件),
    然后从后向前搜索换行符
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • bbspeterlee
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-30 02:06:067楼 得分:0
    引用 1 楼 jieao111 的回复:
    以附加方式打开是不是直接是最后一行

    NO.

    See the code below and its output:
    C/C++ code
    #include <stdio.h> int main() { FILE* fp = fopen("E:\\Software\\VS2008ExpressENUX1397868.iso", "a+b"); /* Or: "ab" */ /* Filesize: 894 MB (938,108,928 bytes) */ fflush(fp); printf("Position: %ld\n", ftell(fp)); fseek(fp, 0, SEEK_END); fflush(fp); printf("Position: %ld\n", ftell(fp)); return 0; } /* Output: Position: 0 Position: 938108928 */
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • bbspeterlee
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-30 02:23:278楼 得分:0
    引用 2 楼 k2eats 的回复:
    fseek(fp, 0L, SEEK_END)没错啊!
    计算机的数据文件按其数据的存放方式,分为3种:
    顺序型:用于连续存放的文本数据
    随机型:用于有固定长度记录结构的文本数据或二进制数据
    二进制型:用于二进制数据
    顺序文件即普通的文本文件,它是一个接一个的顺序排列,要查找一个数据时,必须从头一个一个的读取直到找到要找的位置,所以无法灵活的随意存取
    随机文件的每一个记录都有固定的长度,每一个记录都有一个记录号,在存入数据时,只需指明实地几个记录号就可以把数据存入指定的位置,比较灵活
    由以上定义就知道了,呵呵!!!

    Thanks for your reply.

    如果我知道固定长度,那么我肯定会用
    C/C++ code
    fseek(fp, -LINE_LENGTH, SEEK_END);

    关键是面试官根本就没有提及是不是像这种结构的文件,而且我再三问了,有没有什么前提条件,像文件大小,文件结构之类的。

    你说的所有文件类型,对于我来说是一样的。我认为三者在本质上没有任何区别,搞一个计算机名词“随机文件”,对于我来说有点故弄玄虚(我不是科班出身的),我到今天才知道这就是随机文件,我曾经自己生成过这样的文件(为了行式存取方便)。(fread()和fwrite()以固定长度写入和读出速度比较快)

    至于你说的“每一个记录都有一个记录号,在存入数据时,只需指明实地几个记录号就可以把数据存入指定的位置”,我倒确实不明白,你是怎么实现的,因为在我看来,你要定位到最后一行,本质上还是得很原始地去定位,任何已经写好的函数,时间上都差不多,只不过是调用起来比较方便而已。

    我只想知道最原始的代码,using which 我们可以真正快速定位到最后一行的开头。


    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • bbspeterlee
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-30 02:23:509楼 得分:0
    有一个稍微快一点的方法就是:用fread()读入文件尾部的一个BufferSize大小的数据块,然后再在里面Inversely Search 换行符 strrchr(),找不到再向前读一个BufferSize大小的数据块,一直找到换行符为止(当然有一个换行符都找不到)。
    这种方法我估计能快几倍,但我认为本质上是一样的。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • maplewasp
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-30 08:22:1310楼 得分:1
    引用 2 楼 k2eats 的回复:
    fseek(fp, 0L, SEEK_END)没错啊!
    计算机的数据文件按其数据的存放方式,分为3种:
        顺序型:用于连续存放的文本数据
        随机型:用于有固定长度记录结构的文本数据或二进制数据
        二进制型:用于二进制数据
    顺序文件即普通的文本文件,它是一个接一个的顺序排列,要查找一个数据时,必须从头一个一个的读取直到找到要找的位置,所以无法灵活的随意存取
    随机文件的每一个记录都有固定的长度,每一个记录都有一…

    学习了!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • bbspeterlee
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-30 08:43:4811楼 得分:0
    引用 10 楼 maplewasp 的回复:
    引用 2 楼 k2eats 的回复:
    fseek(fp, 0L, SEEK_END)没错啊!
    计算机的数据文件按其数据的存放方式,分为3种:
    顺序型:用于连续存放的文本数据
    随机型:用于有固定长度记录结构的文本数据或二进制数据
    二进制型:用于二进制数据
    顺序文件即普通的文本文件,它是一个接一个的顺序排列,要查找一个数据时,必须从头一个一个的读取直到找到要找的位置,所以无法灵活的随意存取
    随机文件的每一个记录都有固定的长度,每一个记录都有一个记录号,在存入数据时,只需指明实地几个记录号就可以把数据存入指定的位置,比较灵活
    由以上定义就知道了,呵呵!!!

    ××××××××××××××××××××××
    学习了!

    我还是不知道到底这个随意存取是怎么实现的。对于我来说,k2eats说的几种类型在本质上是一样的。请参见我在8楼的回复。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • qmm161
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-30 09:02:2812楼 得分:0
    mark
    lz 就是传说中的 peter lee 啊,久仰久仰!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zmlovelx
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-30 09:02:4913楼 得分:0
    能想到的似乎就这几种,要说效率更高的,想不出了.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ninesuns02
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-30 09:04:4214楼 得分:0
    引用 2 楼 k2eats 的回复:
    fseek(fp, 0L, SEEK_END)没错啊!
    计算机的数据文件按其数据的存放方式,分为3种:
        顺序型:用于连续存放的文本数据
        随机型:用于有固定长度记录结构的文本数据或二进制数据
        二进制型:用于二进制数据
    顺序文件即普通的文本文件,它是一个接一个的顺序排列,要查找一个数据时,必须从头一个一个的读取直到找到要找的位置,所以无法灵活的随意存取
    随机文件的每一个记录都有固定的长度,每一个记录都有一…


    学习中
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xkyx_cn
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 2

    发表于:2008-05-30 09:25:2415楼 得分:0
    学习学习
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • bbspeterlee
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-30 09:30:1816楼 得分:0
    引用 12 楼 qmm161 的回复:
    mark
    lz 就是传说中的 peter lee 啊,久仰久仰!

    认错人了吧?我只是个一颗星的混混。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Oversense
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-30 09:46:3417楼 得分:4
    引用 9 楼 bbspeterlee 的回复:
    有一个稍微快一点的方法就是:用fread()读入文件尾部的一个BufferSize大小的数据块,然后再在里面Inversely Search 换行符 strrchr(),找不到再向前读一个BufferSize大小的数据块,一直找到换行符为止(当然有一个换行符都找不到)。
    这种方法我估计能快几倍,但我认为本质上是一样的。


    正解, BufferSize 取多少,可以再好好想想
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • cllr
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-30 09:51:3618楼 得分:0
    如果每行不是定长的,或者说不能够通过计算得到最后一行的位置,那么只能通过试探的方法来找到
    如果要说最快的方法,不应该是读到最后,而应该是从文件的开始读,因为是顺序读取文件,所以比
    随机读取文件速度要快,而且操作系统一般都有预取的行为,所以顺序扫描文件应该是最快的;至于
    说使用map文件的方法,其实是和从文件头开始扫描一样的,因为都需要把文件读进用户空间。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • qmm161
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-30 10:11:0519楼 得分:0
    引用 16 楼 bbspeterlee 的回复:
    引用 12 楼 qmm161 的回复:
    mark
    lz 就是传说中的 peter lee 啊,久仰久仰!

    认错人了吧?我只是个一颗星的混混。

    以为你是那个搞视频天空站的peter lee
    http://lspbeyond.go1.icpcn.com/
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xajnewuser
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-30 12:03:0920楼 得分:0
    学习了

    好多高手啊~~
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • bbspeterlee
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-30 13:29:2321楼 得分:0
    我想知道源码,或者伪代码也可以。多谢了。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lin_style
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-30 14:26:3522楼 得分:1
    引用 17 楼 Oversense 的回复:
    引用 9 楼 bbspeterlee 的回复:
    有一个稍微快一点的方法就是:用fread()读入文件尾部的一个BufferSize大小的数据块,然后再在里面Inversely Search 换行符 strrchr(),找不到再向前读一个BufferSize大小的数据块,一直找到换行符为止(当然有一个换行符都找不到)。
    这种方法我估计能快几倍,但我认为本质上是一样的。


    正解, BufferSize 取多少,可以再好好想想


    按硬盘的簇大小取?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • netxuning
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-30 16:23:0323楼 得分:0
    学习
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • blooney
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-30 17:21:4624楼 得分:1
    是不是结果并不重要,关键在于你得到这个结果的过程?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • dk123
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-30 18:38:1625楼 得分:1
    同意结果不重要,要是只重结果这种优化只是省屁吹灯。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • dongdapeng110
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-06-02 08:53:4426楼 得分:0
    我觉得:

    问这种问题没什么意义,不过是一些小技巧而以,能说明什么呢!

    现在网络上信息那么多,不知道又怎么样,上网5分钟就能搞定。

    如此关心这种技巧问题,不知道那些公司想要找的是什么样的人。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • dongdapeng110
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-06-02 09:03:1527楼 得分:0
    还有,随机文件!

    不知道他们在什么书上发现了随机文件的定义!

    文件吗,存储在非易失性存储介质上的数据而以。

    为了人的阅读方便,人为的定义了一种特殊类型的文件--文本文件,其实也没什么特殊的,不过就是把文件中的数据当作某种编码来解释,还是数据。

    别的真没听过。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lsmhtsgf1
    • 等级:
    • 可用分等级:
    • 总技术专家分: