0

セミファンクション ヘッド プログラムを実行したところです。ファイルの末尾に 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 );
}
4

2 に答える 2

2

ファイル全体を通過するカウンターを保持し、合計行数をカウントできます (一度に 1 行ずつ読み取る場合にのみ fgets を呼び出します)。N が行の総数で、n が画面に表示される最後の行の数であるとします。次に、ファイルの先頭から再び開始し、画面に表示せずに N - n 行を通過します (つまり、fputs を呼び出さないでください)。その後、fputs を n 回呼び出します。

于 2012-09-11T07:00:12.887 に答える
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;
    }
于 2012-09-11T08:52:28.200 に答える