【问题标题】:Converting head program to tail C将头部程序转换为尾部 C
【发布时间】:2012-09-11 06:32:56
【问题描述】:

我刚刚运行了一个半函数头程序,我需要帮助将它变成一个尾程序,它将在文件末尾显示 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 );
}

【问题讨论】:

  • 你试过什么?你会如何在有文字的纸上做呢?您是否考虑过向后阅读文件?等等等等……
  • tail 稍微复杂一些,但对于一个简单的实现,您只需在读取文件时将最后 N 行保留在内存中,然后在您点击 EOF 时输出这 N 行。提示:使用循环缓冲区。
  • 我想读取整个文件获取数字,然后循环打印出行。前任。 while (numLines > 0){ fileMaxlines - numLines(用户输入) numlines-- }
  • 您可能想给getopt 看看,当您开始获得更多输入选项时,可能会使您的程序更简单。

标签: c unix head tail


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我使用了你的变量和风格。如果我理解,您想从文件中打印出最后 [X] 行。 [X] - 来自 CLI 的参数

    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    
    #define MAX 1024
    
        FILE *src = NULL;
        FILE *src_end = NULL;
        int linecount = 0;
        char ch[MAX];
    
        int main(int arc, char **argv) {
            int i = 0;
            int letter = 0;
    
            if (arc != 4) {
                puts("Wrong parameters");
                return 1;
            }
    
            do {
                src = fopen(argv[1], "r");
                if (src == NULL) {
                    puts("Can't open input file.");
                    break;
                }
    
                if (0 != strcmp(argv[2], "-n")) {
                    puts("Wrong 2nd parametr");
                    break;
                }
    
                sscanf(argv[3], "%u", &linecount);
                printf("Printout last %u lines, from file:%s\n", linecount,
                        argv[1]);
    
                src = fopen(argv[1], "r");
                if (src == NULL) {
                    fputs("Can't open input file.", stdout);
                    return 1;
                }
    
                for (i = 2; linecount; i++) {
                    fseek(src, -i, SEEK_END);
                    letter = fgetc(src);
                    if (letter == 0x0a) { // 0x0a == "\n"
                        fgets(ch, MAX, src);
                        fputs(ch, stdout);
                        linecount--;
                    }
                }
            } while (0);
    
            fclose(src);
            return 1;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-27
      • 1970-01-01
      • 2012-06-14
      • 1970-01-01
      • 2021-06-29
      • 2020-11-14
      • 2013-01-27
      相关资源
      最近更新 更多