سؤال

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 POS: 0 POS: 0

لماذا هذا؟ هل هناك بديل للعثور على الإزاحة الحالية، باستخدام وظائف I / O RAW؟ فيread, open, lseek, …)

تحرير 1:

حاولت أن أجعل المثال أبسط.

هل كانت مفيدة؟

المحلول

حاول إضافة #include.u003Cunistd.h> الى القمة.

يرى: http://forums.macosxhints.com/archive/index.php/t-35508.html.

في الأساس، لأنك لم تفعل #include <unistd.h>, ، المترجم هو "التخمين" ذلك lseek() إرجاع int.

ربما INT INT هو طول 4 بايت، وبما أن PPC هو طلب بايت "Big-Endian"، فأنت تحصل على "أعلى" 4 بايت، والتي هي كلها صفر.

تشمل UNISTD.H يتيح للمترجم يدرك ذلك lseek() يعود an. off_t, ، لذلك أنت لا تفقد نصف البايتات.

نصائح أخرى

شيء آخر هو ما يصل، ربما شيء سخيف. حاولت الكود الخاص بك، كما هنا:

#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);
}

واحصل على هذه النتيجة:

باش $ دوله خليجي foo.c باش $ ./a.out حجم Off_t: 8 POS: 0 POS: 2352

(فقط لتكون محددة، هذا على Mac OS / X 10.5.6 على Intel.)

تحديث.

أو ربما انها ليست سخيفة. لقد جربتها فقط على G5 PPC، واحصل على النتائج التي تقوم بها.

تحديث 2.

حسنا، إليك النتيجة على PPC:

$ دوله الخليجي foo.c $ ./a.out حجم Off_t: 8 POS: 0 POS: 0

أي نوع من الملف هو؟ هل هو أنبوب بأي فرصة؟ لأنه إذا كان أي شيء سوى ملف منتظم، فحسب، فهي لا تدعم البحث عن:

يتم تعريف سلوك LSEEK () على الأجهزة غير القسرية للبحث عن التنفيذ. قيمة تعويض الملف المرتبط بهذا الجهاز غير محدد.

لست متأكدا من أنني أفهم سؤالك، ولكن فيما يلي بعض الأفكار التي قد تساعد.

  • إزاحة 0 صالحة؛ هذا يعني أنك في بداية الملف
  • اعتمادا على منصتك، قد يقتصر Off_T على 32 بت غير موقعة.
  • هل تنوي البحث عن موقعك الحالي؟

- Markusq.

قد ترغب في تغيير الاختبار إلى:

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

من المحتمل أنك تضرب -1 في مكان ما، لكنك تختبر لمدة 0 هنا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top