سؤال

هل أحتاج إلى الاتصال يدويا close() عندما أستخدم std::ifstream?

على سبيل المثال، في التعليمات البرمجية:

std::string readContentsOfFile(std::string fileName) {

  std::ifstream file(fileName.c_str());

  if (file.good()) {
      std::stringstream buffer;
      buffer << file.rdbuf();
      file.close();

      return buffer.str();
  }
  throw std::runtime_exception("file not found");
}

هل أحتاج إلى الاتصال file.close() يدويا؟ لا ينبغي ذلك ifstream الاستفادة من راي لإغلاق الملفات؟

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

المحلول

رقم

هذا ما هو راي لصالحه، دع المدمرين يقوم بعمله. لا يوجد ضرر في إغلاقه يدويا، لكنه ليس وسيلة C ++، وهي برمجة في C مع الفصول الدراسية.

إذا كنت ترغب في إغلاق الملف قبل نهاية الوظيفة، يمكنك دائما استخدام نطاق متداخل.

في المعيار (27.8.1.5 قالب فئة BASIC_IFSTREAM)، ifstream يجب أن تنفذ مع basic_filebuf عضو يحمل مقبض الملفات الفعلية. وهي تعقد كعضو بحيث عندما تدمير كائن Ifstream، فإنه يدعو أيضا إلى المدمر basic_filebuf. وبعد ومن المعيار (27.8.1.2)، فإن هذا المدمر يغلق الملف:

virtual ˜basic_filebuf();

تأثيرات: يدمر كائن من الصف basic_filebuf<charT,traits>. وبعد المكالمات close().

نصائح أخرى

هل تحتاج إلى إغلاق الملف؟
رقم

يجب أن تغلق الملف؟
يعتمد على.

هل تهتم بظروف الخطأ المحتملة التي قد تحدث إذا فشل الملف في الإغلاق بشكل صحيح؟ تذكر أن المكالمات الوثيقة setstate(failbit) إذا فشل. سوف تدعو المدمر close() بالنسبة لك تلقائيا بسبب راي ولكن لن تترك لك طريقة لاختبار الفشل بت لأن الكائن لم يعد موجودا.

وأنا أتفق مع martin. إذا كتبت إلى الملف، فقد تظل البيانات تجلس على مخزن مؤقت وقد لا تتم كتابتها إلى الملف حتى close() يسمى. دون القيام بذلك يدويا، ليس لديك أي فكرة عما إذا كان هناك خطأ أم لا. عدم الإبلاغ عن الأخطاء للمستخدم هي ممارسة سيئة للغاية.

لا، يتم ذلك تلقائيا من قبل ifstream destructor. السبب الوحيد الذي يجب عليك الاتصال به يدويا، هو أن fstream يجب أن يكون مثيل نطاق كبير، على سبيل المثال إذا كان متغيرا للعضو من مثيل فئة معيشة طويلة.

يمكنك السماح للمدير في القيام به. ولكن تماما مثل أي كائن raii قد يكون هناك أوقات يمكن أن تدعو الدعوة يدويا تحدث فرقا. علي سبيل المثال:

#include <fstream>

using std::ofstream;

int main() {
  ofstream ofs("hello.txt");
  ofs << "Hello world\n";
  return 0;
}

يكتب محتويات الملف. ولكن:

#include <stdlib.h>

#include <fstream>

using std::ofstream;

int main() {
  ofstream ofs("hello.txt");
  ofs << "Hello world\n";
  exit(0);
}

لا. هذه حالات نادرة حيث تنتهي العملية فجأة. عملية تحطم يمكن أن تفعل مماثلة.

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