4

lseek()ファイル記述子の位置を返すことになっています。

ドキュメントには次のように記載されています。

正常に完了すると、lseek() は結果のオフセット位置を、ファイルの先頭からのバイト単位で返します。それ以外の場合は、値 -1 が返され、エラーを示すために errno が設定されます。

問題は、これでもうまくいかないことです:

#include <fcntl.h>
#include <stdio.h>
#include <errno.h>
printf("size off_t: %i\n", sizeof(off_t));

off_t pos;
pos = lseek(file, (off_t)0, SEEK_CUR);
printf("pos: %lli\n", pos);

// same result for SEEK_SET and SEEK_END
pos = lseek(file, (off_t)2352, SEEK_CUR);
printf("pos: %lli\n", pos);

これは私に与えます:

サイズ off_t: 8
位置: 0
位置: 0

どうしてこれなの?生の I/O 関数を使用して、現在のオフセットを見つける代替手段はありますか? ( readopenlseek、 …)

編集1:

例をより簡単にしようとしました。

4

5 に答える 5

8

#include <unistd.h> を先頭に追加してみてください。

参照: http://forums.macosxhints.com/archive/index.php/t-35508.html

基本的に、そうしなかったので、コンパイラはint #include <unistd.h>を返すと「推測」しています。lseek()

おそらく int の長さは 4 バイトで、PPC は「ビッグ エンディアン」のバイト順であるため、「上位」の 4 バイトをすべてゼロで取得しています。

インクルード unistd.h により、コンパイラlseek()は が を返していることを認識できるoff_tため、バイトの半分を失うことはありません。

于 2009-02-25T20:35:46.753 に答える
2

何か他のことが起こっています。おそらく何かばかげたことです。ここにあなたのコードを試しました:

#include <fcntl.h>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>

int main(int argc, char *argv[]){
    off_t pos;
    int file ;
    if((file = open("/Users/chasrmartin/.bash_history",O_RDONLY)) == -1){
        perror(argv[0]);
        exit(1);
    }
    printf("size off_t: %i\n", sizeof(off_t));

    pos = lseek(file, (off_t)0, SEEK_CUR);
    printf("pos: %lli\n", pos);

    // same result for SEEK_SET and SEEK_END
    pos = lseek(file, (off_t)2352, SEEK_CUR);
    printf("pos: %lli\n", pos);

    exit(0);
}

そしてこの結果を得る:

bash $ gcc foo.c
bash $ ./a.out
サイズ off_t: 8
位置: 0
位置: 2352

(正確に言うと、これは Intel 上の Mac OS/X 10.5.6 上にあります。)

アップデート。

または多分それはばかげていません。PPC G5 で試してみたところ、結果が得られました。

更新 2

さて、PPC での結果は次のとおりです。

$ gcc foo.c
$ ./a.out
サイズ off_t: 8
位置: 0
位置: 0
于 2009-02-25T19:56:21.607 に答える
1

どんなファイルですか?もしかしてパイプですか?通常のファイル以外の場合は、シークをサポートしていない可能性があるためです。

シークできないデバイスでの lseek() の動作は実装定義です。このようなデバイスに関連付けられたファイル オフセットの値は定義されていません。

于 2009-02-25T19:15:17.523 に答える
0

あなたの質問を理解できるかどうかはわかりませんが、役立つかもしれないいくつかの考えがあります。

  • オフセット0は有効です。それはあなたがファイルの先頭にいることを意味します
  • プラットフォームによっては、off_tが32ビットの符号なしに制限される場合があります。
  • あなたはあなたの現在の位置に関連して探求するつもりですか?

--MarkusQ

于 2009-02-25T18:39:23.273 に答える
0

テストを次のように変更できます。

if ( (pos = lseek(file, (off_t)i, SEEK_CUR)) != -1 ) {

おそらくどこかで -1 を打っていますが、ここでは 0 をテストしています。

于 2009-02-25T18:37:39.550 に答える