2016-10-20 6 views
-1

以下は、ファイルポインタをfpで表示し、印刷する行の数をnumとしたものです。今は、必要な行ではなく、完全なファイルを表示します。最後のn行のファイルをcを使用して印刷します。

void dispfile(FILE *fp, int num) 
{ 

    long int pos;char s[100]; 
    int count; 
    fseek(fp, 0, SEEK_END); 
    pos=ftell(fp); 

    while(pos) 
    { 
     fseek(fp, --pos, SEEK_SET); 
     if(fgetc(fp)=='\n') 
     { 
      if(count++ == num) 
      break; 
     } 
    } 

    while(fgets(s, sizeof(s), fp)) 
    { 
     printf("%s",s); 
     //fputs(s, stdout); 
    } 

} 
+0

私はあなたのコードを試してみて、それは私のために働いた。 – Barmar

+0

どのように動作したのですか?私には、frst文字を除いてもう一度compltファイルを表示しています。 – Barara

+0

[c/C++のファイルから最後のn行を読み込む]の可能な複製(http://stackoverflow.com/questions/17877025/reading-last-n-lines-from-file-in-cc) – tarashypka

答えて

1

countは初期化されていません。予想外のゴミが含まれており、予期しない瞬間に条件count++ == numが満たされます(厳密に言えば、UBがあります)。

0

あなたは、いくつかの行をスキップして、num行まで印刷すること、第二にその行をカウントするために、二回のファイルを読み込むことで初めてそれを行うことができます。ファイルにnum行がない場合、すべてが印刷されます。 s[]がファイル内で最も長い行を保持すると仮定します。

void dispfile(FILE *fp, int num) 
{ 
    int lines = 0; 
    char s[100]; 

    rewind(fp); 
    while(fgets(s, sizeof s, fp) != NULL) { 
     lines++;        // count the lines 
    } 

    rewind(fp); 
    lines -= num;        // lines to skip 
    while(lines-- > 0) { 
     if(fgets(s, sizeof s, fp) == NULL) { 
      return;        // unexpected EOF 
     } 
    } 

    while(fgets(s, sizeof s, fp) != NULL) {  // print the rest 
     printf("%s", s);      // newline is already included 
    } 
} 
+1

実際にファイルを2回読む必要はありません。 – Olaf

+0

@Olafは配列でキャッシュするか? –

+1

実際に 'char *'のリングバッファです。しかし、私はOPにコードを書いていません、私はコードに多くの努力を見ません。特に問題はありません。現在、あまりにも多くの宿題が尋ねられています。 – Olaf

関連する問題