سؤال

أنا على التوالي في تجاوز عدد صحيح باستخدام معيار ftell و fseek الخيارات داخل G++, ولكن أعتقد أنني كنت مخطئا لأنه يبدو أن ftell64 و fseek64 غير متوفرة.لقد تم البحث في العديد من المواقع يبدو أن المرجعية باستخدام lseek مع off64_t نوع البيانات, ولكن لم أجد أي أمثلة الرجوع شيء يساوي fseek.الآن الملفات التي أنا أقرأ في 16GB+ ملفات CSV مع توقع ما لا يقل عن ضعف هذا.

دون أي المكتبات الخارجية ما هو الأكثر وضوحا طريقة لتحقيق بنية مماثلة كما هو الحال مع fseek/ftell زوج ؟ طلبي الآن يعمل باستخدام معيار دول مجلس التعاون الخليجي/G++ مكتبات 4.x.

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

المحلول

fseek64 هو C وظيفة.لجعلها متاحة عليك أن تحدد _FILE_OFFSET_BITS=64 قبل بما في ذلك نظام رؤوس أكثر أو أقل تحديد fseek أن يكون في الواقع fseek64.أو يفعل ذلك في المترجم الحجج على سبيل المثالدول مجلس التعاون الخليجي -D_FILE_OFFSET_BITS=64 ....

http://www.suse.de/~aj/linux_lfs.html كبيرة overviw من ملف كبير الدعم على لينكس:

  • تجميع البرامج الخاصة بك مع "دول مجلس التعاون الخليجي -D_FILE_OFFSET_BITS=64".هذه القوات الوصول إلى الملفات يدعو إلى استخدام 64 بت المتغيرات.عدة أنواع التغيير أيضا ، على سبيل المثالoff_t يصبح off64_t.ولذلك فمن المهم دائما استخدام أنواع الصحيح و عدم استخدام مثلالباحث بدلا من off_t.لقابلية مع منصات أخرى يجب عليك استخدام getconf LFS_CFLAGS الذي سيعود -D_FILE_OFFSET_BITS=64 على منصات لينكس ولكن قد يعود شيء آخر على مثلسولاريس.لربط, يجب عليك استخدام الرابط الأعلام التي ذكرت عبر getconf LFS_LDFLAGS.على أنظمة لينكس, أنت لا تحتاج إلى رابط خاص الأعلام.
  • تعريف _LARGEFILE_SOURCE و _LARGEFILE64_SOURCE.مع هذه تحدد يمكنك استخدام LFS وظائف مثل open64 مباشرة.
  • استخدام O_LARGEFILE العلم مع العمل على الملفات الكبيرة.

نصائح أخرى

إذا كنت ترغب في التمسك ISO C القياسية واجهات الاستخدام fgetpos() و fsetpos().إلا أن هذه الوظائف هي فقط مفيدة حفظ الملف الموقف والعودة إلى نفس الموقف في وقت لاحق.أنها تمثل موقف باستخدام نوع fpos_t, التي لا يلزم أن يكون نوع البيانات عدد صحيح.على سبيل المثال ، على سجل النظام القائم على أنها يمكن أن تكون البنية التي تحتوي على عدد قياسي وتعويض ضمن السجل.قد يكون هذا الحد أيضا.

POSIX يحدد مهام ftello() و fseeko(), التي تمثل موقف باستخدام off_t نوع.هذا هو المطلوب أن يكون عدد صحيح نوع القيمة إزاحة البايت من بداية الملف.يمكنك إجراء العمليات الحسابية على ذلك ، يمكن استخدام fseeko() لأداء النسبية يسعى.هذا سوف يعمل على لينكس وغيرها POSIX النظم.

وبالإضافة إلى ذلك, ترجمة مع -D_FILE_OFFSET_BITS=64 (لينكس/Solaris).هذا سوف يحدد off_t أن يكون 64 بت من نوع (أي off64_t) بدلا من long, و سيتم تحديد الوظائف التي تستخدم ملف تعويضات إلى أن الإصدارات التي تأخذ 64 بت إزاحة.هذا هو الافتراضي عند تجميع 64 بت ، لذلك ليست هناك حاجة في هذه الحالة.

fseek64() ليس معيار, مترجم مستندات ينبغي أن أقول لكم أين يمكن العثور عليه.

هل حاولت fgetpos و fsetpos?أنها مصممة الملفات الكبيرة وتنفيذ عادة يستخدم 64 بت نوع قاعدة fpos_t.

هل حاولت fseeko() مع _FILE_OFFSET_BITS المعالج رمز تعيين 64?

هذا وسوف تعطيك fseek()مثل واجهة ولكن مع إزاحة المعلمة من نوع off_t بدلا من طويلة.الإعداد _FILE_OFFSET_BITS=64 سوف تجعل off_t 64 بت نوع.

نفس الشيء ينطبق على ftello().

استخدام fsetpos(3) و fgetpos(3).أنها تستخدم fpos_t نوع البيانات التي أعتقد هو ضمان أن تكون قادرة على الاستمرار على الأقل 64 بت.

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