سؤال

أحاول العثور على إجابة محددة ولا أستطيع، لذلك آمل أن يعرف شخص ما.

أقوم بتطوير تطبيق C++ باستخدامGC 4.x على Linux (نظام تشغيل 32 بت).يجب أن يكون هذا التطبيق قادرًا على قراءة الملفات التي يزيد حجمها عن 2 جيجابايت.

أرغب حقًا في استخدام عناصر iostream مقابل.مؤشرات FILE، ولكن لا يمكنني العثور على ما إذا كان الملف الكبير #defines (_LARGEFILE_SOURCE، _LARGEFILE64_SOURCE، _FILE_OFFSET_BITS=64) له أي تأثير على رؤوس iostream.

أقوم بالتجميع على نظام 32 بت.إن أي مؤشرات تكون مفيدة.

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

المحلول

لقد تم تحديد هذا بالفعل بالنسبة لك متى libstdc++ تم تجميعها، وعادة ما يعتمد على ما إذا كان أم لا _GLIBCXX_USE_LFS تم تعريفه في c++config.h.

إذا كنت في شك، قم بتمرير ملفك القابل للتنفيذ (أو libstdc++.so, ، إذا كان الارتباط ضده ديناميكيًا) من خلال readelf -r (أو من خلال strings) ومعرفة ما إذا كان لديك ثنائي/libstdc++ مرتبطة ضد fopen/fseek/إلخ.أو fopen64/fseek64/إلخ.

تحديث

لا داعي للقلق بشأن حد 2 جيجابايت طالما أنك لا تحتاج/تحاول ذلك fseek أو ftell (أنت تقرأ فقط من الدفق أو تكتب إليه.)

نصائح أخرى

إذا كنت تستخدم دول مجلس التعاون الخليجي، يمكنك الاستفادة من تمديد مجلس التعاون الخليجي دعا __gnu_cxx :: stdio_filebuf، الذي يربط على IOStream لمعيار C <م> FILE اصف.

وتحتاج إلى تعريف شيئين التالية:

<اقتباس فقرة>   

و_LARGEFILE_SOURCE

     

و_FILE_OFFSET_BITS = 64

وعلى سبيل المثال:

#include <cstdio>
#include <fstream>
#include <ext/stdio_filebuf.h>

int main()
{
  std::ofstream outstream;
  FILE* outfile;

  outfile = fopen("bigfile", "w");

  __gnu_cxx::stdio_filebuf<char> fdbuf(outfile, std::ios::out |
                                       std::ios::binary);
  outstream.std::ios::rdbuf(&fdbuf);

  for(double i = 0; i <= 786432000000.0; i++) {
    outstream << "some data";

  fclose(outfile);
  return 0;

و}

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