0

これを実行して、ファイルの最後の50文字を読み取ろうとしています。

FILE* fptIn;
char sLine[51];
if ((fptIn = fopen("input.txt", "rb")) == NULL) {
    printf("Coudln't access input.txt.\n");
    exit(0);
}
if (fseek(fptIn, 50, SEEK_END) != 0) {
    perror("Failed");
    fclose(fptIn);
    exit(0);
}
fgets(sLine, 50, fptIn);
printf("%s", sLine);

これは、リモートで意味のあるものを返しません。なんで?

4

4 に答える 4

11

50を-50に変更します。また、これはASCIIなどの固定長文字エンコーディングでのみ機能することに注意してください。UTF-8のようなものでは、最後から50番目の文字を見つけるのは簡単ではありません。

于 2010-02-15T09:55:10.397 に答える
1

オフセットを -50 に設定してみてください。

于 2010-02-15T09:58:23.373 に答える
1

オフセットの兆候に加えて、次のことが問題を引き起こす可能性があります。

改行文字は fgets の読み取りを停止させますが、有効な文字と見なされるため、str にコピーされる文字列に含まれます。

ferror または feof を使用して、エラーが発生したかどうか、またはファイルの終わりに達したかどうかを確認します。

こちらもご覧ください

于 2010-02-15T09:58:27.957 に答える
0

fseek(fptIn, 50, SEEK_END)

ファイルの末尾にストリーム ポインターを設定し、カーソルをその 50 バイト先に配置しようとします。バイナリ ストリームの場合は、次の点に注意してください。

3バイナリ ストリームの場合、ファイルの先頭からの文字数で測定された新しい位置は、whence で指定された位置にオフセットを追加することによって取得されます。 SEEK_CUR の場合はファイル位置インジケータの、SEEK_END の場合はファイルの終わり。バイナリ ストリームは、whence 値が SEEK_END の fseek 呼び出しを意味のある形でサポートする必要はありません。

この呼び出しは失敗するはずです。への次の呼び出しは、 fgetsUB を呼び出します。オフセットとして -50 を試し、呼び出しが成功した場合は、バッファーに読み込もうとします

注:強調鉱山

于 2010-02-15T10:02:53.770 に答える