5

次の文字列を含む hi.txt という名前のテキスト ファイルがあるとします。

AbCdE12345

このコードを実行するとしましょう:

int main() {
  FILE *fp;
  fp = fopen("hi.txt","r");
  if(NULL == fp) { return 1; }
  fseek(fp,-1, SEEK_END);
  while (ftell(fp) > 0) {
     printf("%c",fgetc(fp));
     fseek(fp,-4, SEEK_CUR);
  }
  fclose(fp);
  return 0;
}

このコードを実行すると、次のように出力されました。3EbCd

何を出力するかを推測しようとしたとき、52d であるべきだと思いました。ここで何が起こったのか説明できる人はいますか?

4

2 に答える 2

15

ファイルの最後に、印刷できない行末文字があるようです。それが最初に印刷されるものです。次に、3E、 と順番に位置を移動しbます。この時点で-3、場所が になるため、 による再配置は失敗します-2。ファイルカーソルは元の場所、つまりC次に印刷される場所にとどまります。次の再配置の試みも失敗するため、d出力されます。次の再配置が成功し、ループが終了します。

fseekが無視される状況を検出するには、次のように戻り値を確認します。

while (ftell(fp) > 0) {
    printf("%c",fgetc(fp));
    // Successful calls of fseek return zero
    if (fseek(fp,-4, SEEK_CUR)) {
        // Exit the loop if you can't jump back by 4 positions
        break;
    }
}
于 2013-07-15T16:19:50.137 に答える
4

テキスト モードで開かれたファイルの場合、 に渡されるオフセットは、fseekによって返される値に対してのみ意味がありますftell。したがって、オフセットは必ずしもバイト単位であるとは限りません。バイナリ モードでファイルを開いてみます。

fp = fopen("hi.txt", "rb");

結果が異なるかどうかを確認します。

于 2013-07-15T16:22:53.567 に答える