2012-09-11 35 views
0

我剛剛得到了一個半功能頭部程序,我需要幫助將它製作成尾部程序,它將在文件末尾顯示x行數。這是我的頭碼。 我很難考慮如何讓計數器讀取整個文件,然後從底部開始並顯示文件的最後一行。將頭部程序轉換爲尾部C

#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); 
} 
+0

你試過了什麼?你如何在文字上做文字?你有沒有考慮向後讀文件?等等...... –

+4

尾部稍微複雜一些,但是對於一個簡單的實現,您只需要在讀取文件時保留最後N行,然後在打開EOF時輸出這N行。提示:使用循環緩衝區。 –

+0

我想讀取整個文件獲取數字,然後打印循環中的行。恩。 while(numLines> 0){fileMaxlines - numLines(用戶輸入) numlines--} –

回答

1

我用你的變量和風格。如果我明白,你想從文件打印最後的[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; 
    } 
2

您可以保留一個計數器來通過整個文件並計算總行數(僅調用fgets一次讀取一行)。假設N是行總數,n是屏幕上顯示的最後行數。然後在文件開始處再次啓動N-n行而不在屏幕上顯示它們(即不調用fputs),然後再調用fputs n次。