سؤال

أحتاج إلى تحديد حجم البايت للملف.

لغة الترميز هي C ++ وعمل التعليمات البرمجية مع نظام Linux و Windows وأي نظام تشغيل آخر. هذا يعني استخدام وظائف / فئات C + C ++ القياسية.

هذه الحاجة التقفية لم يبدو أي حل تافهة.

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

المحلول

باستخدام دفق STD يمكنك استخدامه:

std::ifstream ifile(....);
ifile.seekg(0, std::ios_base::end);//seek to end
//now get current position as length of file
ifile.tellg();

إذا تعاملت مع ملف الكتابة فقط (STD :: Ofstream)، فإن الأساليب هي بعضها البعض:

ofile.seekp(0, std::ios_base::end);
ofile.tellp();

نصائح أخرى

يمكنك استخدام مكالمة النظام الأساسي:

#ifdef WIN32 
_stat64()
#else
stat64()

إذا كنت بحاجة فقط إلى حجم الملف، فهذا بالتأكيد مبالغ فيه ولكن بشكل عام سأذهب إليه boost.filesystem. لعمليات الملفات المستقل من المنصة. من بين وظائف السمات الأخرى التي يحتوي عليها

template <class Path> uintmax_t file_size(const Path& p);

يمكنك العثور على المرجع هنا. وبعد على الرغم من أن تعزز المكتبات قد تبدو ضخمة، فقد وجدت أنه في كثير من الأحيان تطبيق الأشياء بكفاءة للغاية. يمكنك أيضا استخراج الوظيفة التي تحتاجها فقط ولكن هذا قد يهدف إلى الصعوبة كما هو معقد إلى حد ما.

السبايات:

std::ifstream ifs; 
ifs.open("mybigfile.txt", std::ios::bin); 
ifs.seekg(0, std::ios::end); 
std::fpos pos = ifs.tellg();

غالبا ما نريد أن ننجز الأمور بطريقة محمولة، ولكن في بعض المواقف، خاصة مثل هذا، أود أن أوصي بشدة باستخدام نظام API للنظام للحصول على أفضل أداء.

تتطلب قابلية النقل منك استخدام القواسم الأقل شيوعا، والتي ستكون C. (وليس C ++) الطريقة التي أستخدمها هي ما يلي.

#include <stdio.h>

long filesize(const char *filename)
{
FILE *f = fopen(filename,"rb");  /* open the file in read only */

long size = 0;
  if (fseek(f,0,SEEK_END)==0) /* seek was successful */
      size = ftell(f);
  fclose(f);
  return size;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top