将 head 程序转换为 tail C

标签 c unix tail unix-head

我刚刚运行了一个半功能 head 程序,我需要帮助才能将它变成 tail 程序,它将在文件末尾显示 x 行数。这是我的头代码。 我无法思考如何让计数器读取整个文件,然后从底部开始显示文件的最后几行。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 1024


int numLines = 0;
int linecount = 0;
FILE *src = NULL;
char ch[MAX];


void GetArgs (int argc, char **argv){
if(argc != 4 || argc != 2) {
    printf("Error not enough arguments to continue \n", argv[0]);
    exit(-1);

}// end if argc doenst = 4 or 2

if(argc == 2){
    src = fopen( argv[1], "r:");
    numLines=10;

}// end argc = 2

if(argc == 4){
    if (strcmp (argv[1], "-n") !=0 ){
        numLines = atoi (argv[2]);
        src = fopen (argv[3], "r");
        if ( src == NULL){
            fputs ( "Can't open input file." , stdout);
            exit (-1);
        }
        while (NULL != fgets(ch, MAX, src)){
            linecount++;
            fputs(ch, stdout);
            if (linecount == numLines){
                break;
            }
        }

    }//end of nested if
     else if (strcmp (argv[2], "-n") !=0 ){
        numLines = atoi (argv[3]);
        src = fopen (argv[1], "r");
        if ( src == NULL){
            fputs ( "Can't open input file." , stdout);
            exit (-1);
        }
        while (NULL != fgets(ch,MAX, src)){
            linecount++;
            fputs(ch, stdout);
            if (linecount == numLines){
                break;
            }
        }            


    }//end of else
}//end if argc == 4

}// end GetArgs


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



GetArgs(argc, argv);

   fclose( src );
}

最佳答案

你可以保留一个计数器来遍历整个文件并计算总行数(一次只调用 fgets 读取一行)。假设 N 是总行数,n 是要在屏幕上显示的最后一行数。然后在文件的开头重新开始,通过 N - n 行而不在屏幕上显示它们(即不调用 fputs),之后调用 fputs n 次。

关于将 head 程序转换为 tail C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12363966/

相关文章:

python - 从 subprocess.Popen 调用 "source"命令

linux - Bash 将尾部值分配给变量

linux - unix 脚本来 grep 选择日期范围?

来自控制台的带引号/空格的 Javafx 命名参数

linux - Tail -f 通过管道传输到 > awk 通过管道传输到文件 > 文件不起作用

c - getchar() 等同于 scanf ("%c") 和 putchar() 等同于 printf ("%c") 吗?

c - 是什么让它在标记化后插入新元素时不起作用

C 链表中的冒泡排序

c - 将 sendmsg/sendmmsg 与原始以太网帧一起使用