fseek()
とgetline
の組み合わせを使用して、linux tail
コマンドをcで実装する方法を理解する助けが必要です。fessek()とgetline()を使用してテールコマンドを使用する - アウトオブオーダー
私はfseek()
を使用してファイルの最後に到達し、whileループを使用して後方に反復します。
改行文字( '\ n')が検出された場合。私はラインをプリントアウトし、getline
から '\ n'が検出された位置を引く前に、私が到達した位置に戻ります。
「\ n」が検出されない場合、現在の位置iから-2のオフセットを使用すると、後方に反復されます。
私はバッファを含むtailコマンドを実行する方が簡単だが、アルゴリズムは正しいと思いますか?もしそうなら、それを実装する最良の方法は何か。
ありがとうございます。
void tail(FILE *ifp, int k) {
int line_count=0;
char *line=NULL;
size_t len=0;
//go to end of file
if(fseek(ifp,-1,SEEK_END)) {
fprintf(stderr,"Failure in reaching end of file\n");
}
//while loop which will iterate backward starting at the end of file until line_count = k.
while(line_count != k) {
//if detected a newline character, increment line_count, print out line then return back to previous position.
if(fgetc(ifp)=='\n') {
getline(&line, &len, ifp);
printf("%s", line);
fseek(ifp,-strlen(line), SEEK_CUR);
line_count++;
//free(line);
} else {
//move back a single positon
fseek(ifp,-(strlen(line)+2), SEEK_CUR);
}
}
//free(line);
fclose(ifp);
printf("-----\nfunction exited\n-------\n");
}
ありがとう、私は '\ n'に問題があり、それを実現した直後です。私は間違いなくあなたの答えを逆のファイルを読むときの将来の参照として使用しています、もう一度ありがとうございます。 – Omar