中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > C/C++
tail.c
作者:未知 时间:2005-09-13 23:27 出处:Blog.ChinaUnix.net 责编:chinaitpower
              摘要:tail.c
C程序设计语言里有一道习题是,tail -n

根据n的值打印,输入行的最后几行。默认打印10行,

我写了一个,代码如下,供大家交流讨论

#include
#include
#define MAXLINES 1000
char *lineptr[MAXLINES];
int readlines(char *lineptr[],int lines);
void writelines(char *lineptr[],int lines);

int main(int argc,char *argv[])
{
int lines;
char str;
int digit=0;

if( argc >1 )
{ if((*++argv)[0] == '-' )
{
while((str=*++argv[0])!='')
if(str>='0' && str <='9')
digit=digit*10+(str-'0');
else
{digit=10; break;}
}
else digit=10;
}
else digit=10;

if( (lines=readlines(lineptr,MAXLINES) ) >= 0 )
{
if(digit==10)
{
if( lines < digit)
writelines(lineptr,0);
else
writelines(lineptr,lines-digit);
}
else if(lines
writelines(lineptr,0);
else
writelines(lineptr,lines-digit);
}
return 0;
}

#define MAXLEN 1000
int getline(char *,int);
char *alloc(int);

int readlines(char *lineptr[],int maxline)
{
int nlines=0;
int len;
char *p,line[MAXLEN];

while( (len=getline(line,MAXLEN)) >0 )
{
if(len>MAXLEN || (p=alloc(len))==NULL)
return -1;
else{
line[len-1]='';
strcpy(p,line);
[nlines++]=p;
}
}
return nlines;
}
/*void writelines(char *lineptr[],int begin )
{//writelines的另一种实现方式
char **ptr;
for(ptr=lineptr+begin;ptr<=lineptr+lines-1;++ptr)
printf("%s\n",*ptr);
}*/
void writelines(char *lineptr[],int begin )
{
lineptr+=begin;

while(*lineptr!=NULL)
printf("%s\n",*lineptr++);
}
int getline(char line[],int maxline)
{

int c;
int i=0;

while( --maxline > 0 && (c=getchar())!=EOF && c!='\n')
line[i++]=c;
if(c=='\n')
line[i++]='\n';
line[i]='';
return i;
}

#define ALLOCSIZE 10000
static char allocbuf[ALLOCSIZE];
static char *allocp=allocbuf;

char *alloc(int n)
{
if(allocbuf+ALLOCSIZE-allocp>=n)
{
allocp+=n;
return allocp-n;
}
return NULL;
}

listli的代码:支持文件名,比较通用的说

#include
#include

#define LINE 1000
#define SIZE 512

struct lines {
int chs;
}info[LINE];
static int total; /*total lines*/
static FILE *fp;
static int n; /*the last n lines to be read*/

void
printUsage()
{
fprintf(stderr, "Usage: tail [-n] [filename]\n");
exit(1);
}

int
cmdParse(int argc, char **argv)
{
if (argc == 1) {
fp = stdin;
n = 10;
} else if(argc == 2) {
if (argv[1][0] == '-') {
n = atoi(&argv[1][1]);
fp = stdin;
} else {
n = 10;
fp = fopen(argv[1],"r");
}
} else if(argc == 3) {
n = atoi(&argv[1][1]);
fp = fopen(argv[2],"r");
} else {
printUsage();
}
return n;
}

void tail(int);
int
main(int argc,char **argv)
{

cmdParse(argc,argv);
char tembuf[SIZE];
int i ;
for( i = 0; fgets(tembuf,sizeof tembuf,fp); ++i) {
info[i].chs = strlen(tembuf);
total++;
}
tail(n);
while(fgets(tembuf,sizeof tembuf,fp))
fputs(tembuf,stdout);
return 0;
}

void
tail(int n)
{
int tolen = 0;
int i;
for(i = total - n ; i < total ;++i)
tolen += info[i].chs;
fseek(fp,-tolen,SEEK_CUR);
}

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有