免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
61 [报告]
发表于 2007-04-07 18:33 |只看该作者
我刚才把书说错了,是《unix 高级编程》,书上是这么说的:
read( int fd,void *buf,size_t nbytes )
在某些读环境,可能受到的字节数少于nbytes参数请求字节数。
从常规文件读时,当尝试满足计数到达了文件尾时,就可能发生
这种情况。在其他情况下,当从常规文件读时,保证直到nbytes
返回时,函数不会返回。

我对红字部分的理解是:当文件的字节没有nbytes这么大时,读到了文件尾函数便会返回,
但这时已经确保的文件已经可以完整的读入buf中。

[ 本帖最后由 C_C 于 2007-4-7 18:35 编辑 ]

论坛徽章:
0
62 [报告]
发表于 2007-04-07 21:01 |只看该作者
用  getline吧  每次读一行

论坛徽章:
0
63 [报告]
发表于 2007-04-07 21:25 |只看该作者
我想起来了. <UNIX网络编程>第三版好象有说这样的问题.......汗..不年多没看了

论坛徽章:
0
64 [报告]
发表于 2007-04-10 21:28 |只看该作者
C里面有个函数叫fseek(),用来移动文件位置的,你可以用他来移到需要读取的行好,在调用read()

论坛徽章:
0
65 [报告]
发表于 2007-04-10 23:17 |只看该作者
1,第九行结束之后,就是第十行。
2,记住前一个新行位置,到10的时候,回去。
3,如果遇到'\0'呢?

[ 本帖最后由 yuanchengjun 于 2007-4-10 23:20 编辑 ]

论坛徽章:
0
66 [报告]
发表于 2007-04-13 12:51 |只看该作者
原帖由 pianoguy 于 2007-4-10 21:28 发表
C里面有个函数叫fseek(),用来移动文件位置的,你可以用他来移到需要读取的行好,在调用read()


那只能用来移动字节,不是行。

论坛徽章:
0
67 [报告]
发表于 2007-04-18 15:03 |只看该作者

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
68 [报告]
发表于 2007-04-18 15:18 |只看该作者
原帖由 tianxiaogang12 于 2007-4-7 21:01 发表
用  getline吧  每次读一行

这个的移植性不太好。
Both getline() and getdelim() are GNU extensions.  They are available since libc 4.6.27.

论坛徽章:
0
69 [报告]
发表于 2007-04-22 17:16 |只看该作者
1 如果是定长的文件       
               record_line = 9* RECORD_LENGTH;(包括换行符\n)
        fseek(fp,record_line,SEEK_SET);
        fgets(temp_fp,1000,fp);
2 变长的只能fgets10次了

论坛徽章:
0
70 [报告]
发表于 2007-04-23 13:14 |只看该作者
利用管道做个通用的定长非定长都适用
head10.c
#include<stdio.h>
int main( int argc ,char * argv[])
{
  char filename[200]={0};
  char strcmd[200]={0};
  char bufcount[200]={0};
  int recordline=0;
  int line=0;
  char temp_fp[1000]={0};
  FILE *fp=NULL;
  FILE *fRead=NULL;

  if(argc!=3)
  {
    printf("program line filename\n");
    exit(-1);
  }


  line=atoi(argv[1])-1;
  if(line<0)
  {
    printf("line error!\n");
    exit(-1);
  }

  memset(filename,0,sizeof(filename));
  strcpy(filename,argv[2]);
  memset(strcmd,0,sizeof(strcmd));
  sprintf(strcmd,"head -%d %s|wc -c",line,filename);

  if((fRead=popen(strcmd,"r"))!= NULL)
  {
        fgets(bufcount,sizeof(bufcount),fRead);
        recordline=atoi(bufcount);

        pclose(fRead);
  }
  if((fp=fopen(filename,"r"))==NULL)
  {
       printf("can't open %s\n",filename);
       exit(-1);
  }
  fseek(fp,recordline,SEEK_SET);
  fgets(temp_fp,sizeof(temp_fp),fp);
  printf("%s\n",temp_fp);
  fclose(fp);

  return 0;
}

编译cc -o head10 head10.c
运行例子:head10 11 aa.txt
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP