c语言只读取文件前五行,C语言 打印文件前N行 输入head-n5。意为打印文件前五行。 输入head- n-5。意为打印...

匿名用户

1级

2014-06-25 回答

这是我刚学c是写的程序,你稍修改一下输入部分,便可。

仿 unix tail 命令功能。

程序名 5 文件名 -- 打印文件前五行

程序名 -5 文件名 -- 打印文件倒五行

/* ======================================================================*

* tail.c

* PC DOS Prompt tool, partly similar to unix tail:

* tail -50 namein

* ======================================================================*/

#include

#include

#include

FILE *fin;

char namein[120];

void message1(char * progname);

main (int argc, char *argv[])

{

int NN_total_line;

int N;

int i,j,k;

int gb;

int i_start, i_end;

int i_current;

if (argc < 3) (void) message1( argv[0] );

sscanf(argv[1],"%d", &N);

strcpy(namein,argv[2]);

if ( (fin = fopen(namein,"rb") ) == NULL ) {

printf("\007Cann't open input file: %s ", namein);

exit(1);

};

/* ----- get the total line in a file ------*/

NN_total_line = 0;

entrance0:

if ( (gb = fgetc(fin)) ==EOF ) goto Lab1;

if (gb == '\n') NN_total_line = NN_total_line + 1;

goto entrance0;

Lab1: (void) rewind(fin);

/* -------get output start and end line number ----*/

if ( N < 0 ) {

i_end = NN_total_line;

i_start = NN_total_line + N;

if ( i_start < 0 ) i_start = 0;

} else {

i_start = 0;

i_end = N;

if (i_end > NN_total_line) i_end = NN_total_line;

} ;

i_current = 1;

entrance:

if ( (gb = fgetc(fin)) ==EOF ) goto Lab2;

if (i_start > i_current) {

if (gb == '\n') i_current = i_current + 1;

goto entrance;

};

if (i_start == i_current) {

putc(gb,stdout);

if (gb == '\n') i_current = i_current + 1;

goto entrance;

};

if (i_start < i_current && i_end >= i_current) {

putc(gb,stdout);

if (gb == '\n') i_current = i_current + 1;

goto entrance;

};

goto entrance;

Lab2:fclose(fin);

}

void message1 (char * progname)

{

fprintf(stderr, "=============================================================\n");

fprintf(stderr, "The prog output a number of last or first lines in a file\n");

fprintf(stderr, "similar to unix tail command\n");

fprintf(stderr, "If -number is positive value then similar to unix head command\n");

fprintf(stderr, "\007Usage: %s -number file\n", progname);

fprintf(stderr, "For example: %s -50 index.html\n", progname);

fprintf(stderr, "For example: %s 20 index.html\n", progname);

fprintf(stderr, "Loonie 2000-Nov-22\n");

fprintf(stderr, "=============================================================\n");

exit(1);

}

追问:

大神啊。这我基本看不懂。完蛋了。

追答:

sscanf(argv[1],"%d", &N); // 读命令行参数, 5 或 -5

strcpy(namein,argv[2]); // 读命令行参数,取得输入文件名

if ( (fin = fopen(namein,"rb") ) == NULL ) {。。} // 打开输入文件

下面一段,获得文件内容 总行数。

rewind(fin); // 文件指针回到文件开始。

下面一段,获得 需要输出的内容 开始行号 和 结束行号,N 为 负 输出 倒 N 行,为正,输出前 N 行。

message1()是程序使用方法。如果命令行参数少于要求,则打印程序使用方法。

追问:

要怎么修改才可以?我是真的一点都不会

追答:

下面例子 告诉你怎样读出文件名 和 行数。

假定程序名: mm.exe

文件名:a.txt

命令行:

mm.exe head-n5 a.txt

mm.exe head-n-5 a.txt

读得:

文件名 a.txt

N 5 或 -5

#include

main(int argc, char *argv[]){

char namein[80];

char h[30];

int N;

if (argc<3){

printf("%s head-n5 a.txt\n",argv[0]);

printf("%s head-n-5 a.txt\n",argv[0]);

exit(0);

}

strcpy(h,argv[1]);

strcpy(namein,argv[2]);

sscanf(h,"%*[^n]n%d",&N);

printf("%s %d",namein,N);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值