匿名用户
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);
}