免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: zhjufe
打印 上一主题 下一主题

请问:怎么从某一确定的行开始读文件? [复制链接]

论坛徽章:
0
41 [报告]
发表于 2007-04-07 15:54 |只看该作者
原帖由 flw 于 2007-4-7 15:39 发表

那是写 log 的人的问题
呵呵,有点强词夺理了。
其实我的意思是说,我写程序很注重“语义”。用合适的函数去做合适的事。
像 fgets,就没法读取中间包含有 '\0' 的行——它不是 fread,它返回的只能是字 ...





市长姐。 那到底你写的能否正确呢?如果文中包含0x00的确是有可能。
fgets()读到0x00那里会停了? 应该是吧。 但多不影响吧。 最多是多了一次while.
啊。 你判断的是\n才结束啊。 应该没错吧?

论坛徽章:
1
双子座
日期:2015-01-04 14:25:06
42 [报告]
发表于 2007-04-07 15:58 |只看该作者
flw好像不务正业哈
身为perl版的版主
我一般都在这个版看到她

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
43 [报告]
发表于 2007-04-07 16:03 |只看该作者
原帖由 linuxcici 于 2007-4-7 15:54 发表

市长姐。 那到底你写的能否正确呢?如果文中包含0x00的确是有可能。
fgets()读到0x00那里会停了? 应该是吧。 但多不影响吧。 最多是多了一次while.
啊。 你判断的是\n才结束啊。 应该没错吧?

fgets 在包含 '\0' 的时候不能正确工作(虽然它能读出一行,但是它无法告诉你它究竟读了几个字节)。
因此可能包含有 '\0' 时用 fgets 本来就是错误的选择。

论坛徽章:
0
44 [报告]
发表于 2007-04-07 16:04 |只看该作者
原帖由 yecheng_110 于 2007-4-7 15:58 发表
flw好像不务正业哈
身为perl版的版主
我一般都在这个版看到她

我都说了flw是本版的老版主,感情深厚啊

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
45 [报告]
发表于 2007-04-07 16:10 |只看该作者
原帖由 soul_of_moon 于 2007-4-7 16:04 发表

我都说了flw是本版的老版主,感情深厚啊

关键是 Perl 版的帖子太少,不够我看的。

论坛徽章:
0
46 [报告]
发表于 2007-04-07 16:14 |只看该作者
原帖由 flw 于 2007-4-7 16:03 发表

fgets 在包含 '\0' 的时候不能正确工作(虽然它能读出一行,但是它无法告诉你它究竟读了几个字节)。
因此可能包含有 '\0' 时用 fgets 本来就是错误的选择。




abcdef\0ijk\n
sdfedfesse\n
.
.
.
如果用fgets() 怎么不行呢?遇到\0的话只会使while()多运行一次吧。但就不能用 && strlen...

&& buffer[strlen(buffer)-1]!='\n'  || buffer[strlen(buffer)-1]=='\0')不就行了?

[ 本帖最后由 linuxcici 于 2007-4-7 16:17 编辑 ]

论坛徽章:
0
47 [报告]
发表于 2007-04-07 16:19 |只看该作者
这个可以减少很多IO操作


  1. char *p,*pp;
  2. stat st;
  3. int fd;
  4. stat("..",&st);
  5. p =(char *)malloc(sizeof(char)*st.st_size);
  6. fd = open("...",...);
  7. read(fd,p,st.st_size);
  8. int i = 1;
  9. pp=strtok(p,"\n");
  10. while( pp != NULL )
  11. {
  12.         pp=strtok(NULL,"\n")
  13.         if( ++i == 10 )
  14.         {
  15.                 .....
  16.         }
  17. }
  18. free(p);
  19. close(fd);
复制代码

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
48 [报告]
发表于 2007-04-07 16:20 |只看该作者
原帖由 C_C 于 2007-4-7 16:19 发表
这个可以减少很多IO操作

[code]
char *p,*pp;
stat st;
int fd;
stat("..",&st);
p =(char *)malloc(sizeof(char)*st.st_size);
fd = open("...",...);
read(fd,p,st.st_size) ...

read 不行,得 fread。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
49 [报告]
发表于 2007-04-07 16:21 |只看该作者
原帖由 linuxcici 于 2007-4-7 16:14 发表




abcdef\0ijk\n
sdfedfesse\n
.
.
.
如果用fgets() 怎么不行呢?遇到\0的话只会使while()多运行一次吧。但就不能用 && strlen...

&& buffer[strlen(buffer)-1]!='\n'  || buffer[ ...

第二次循环的话,就从第下一行开始了,fgets 会把 '\0' 连同它后面的东西都吃进来,但就是不告诉你它吃了多少。

论坛徽章:
0
50 [报告]
发表于 2007-04-07 16:21 |只看该作者
原帖由 C_C 于 2007-4-7 16:19 发表
这个可以减少很多IO操作

[code]
char *p,*pp;
stat st;
int fd;
stat("..",&st);
p =(char *)malloc(sizeof(char)*st.st_size);
fd = open("...",...);
read(fd,p,st.st_size) ...

你也太狠了些吧。一下子全读进来?
那还不如用mmap呢。

评分

参与人数 1可用积分 +1 收起 理由
langue + 1 言之有理。

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP