ابحث وقراءة ملفات كبيرة في لينكس C++ التطبيق
-
10-07-2019 - |
سؤال
أنا على التوالي في تجاوز عدد صحيح باستخدام معيار 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.
استخدام fsetpos(3)
و fgetpos(3)
.أنها تستخدم fpos_t
نوع البيانات التي أعتقد هو ضمان أن تكون قادرة على الاستمرار على الأقل 64 بت.