আমাকে নিজেই কোনও আইফ্রিমিটি বন্ধ করতে হবে?


201

আমি 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 ব্যবহার করা উচিত নয় ?

উত্তর:


251

কোন

এটিই আরআইআই এর জন্য, ধ্বংসকারীকে তার কাজটি করতে দিন। এটি ম্যানুয়ালি বন্ধ করার কোনও ক্ষতি নেই, তবে এটি সি ++ উপায় নয়, এটি সিতে ক্লাস সহ প্রোগ্রামিং করছে।

আপনি যদি কোনও ফাংশন শেষ হওয়ার আগে ফাইলটি বন্ধ করতে চান তবে আপনি সর্বদা নেস্টেড স্কোপ ব্যবহার করতে পারেন।

স্ট্যান্ডার্ডে (২.8.৮.১.৫ ক্লাস টেম্পলেট বেসিক_ফ্রোম) আসল ফাইল হ্যান্ডেল ifstreamসহ একজন basic_filebufসদস্যের সাথে প্রয়োগ করা হবে । এটি সদস্য হিসাবে রাখা হয় যাতে কোনও আইফ্রিম অবজেক্ট যখন ডিস্ট্রোচার করে তখন এটি ডিস্ট্রাক্টরকে কলও করে basic_filebuf। এবং স্ট্যান্ডার্ড (27.8.1.2) থেকে, সেই ডেস্ট্রাক্টর ফাইলটি বন্ধ করে দেয়:

virtual ˜basic_filebuf();

প্রভাব: শ্রেণীর একটি বিষয় ধ্বংস করে basic_filebuf<charT,traits>। কল close()


4
+1 আমি জানতাম না যে RAII হ্যান্ডেল করে ... আমার ধারণা আপনি প্রতিদিন কিছু নতুন
শিখেন

21
কেবল ফাইলটি বন্ধ করতে নেস্টেড স্কোপ ব্যবহার করা সম্পূর্ণ কৃত্রিম - আপনি যদি এটি বন্ধ করতে চান তবে এটিতে ক্লোজ () কল করুন।

3
যদিও, আপনি যুক্তি দিতে সক্ষম হতে পারেন যে অবজেক্টের জীবনকালকে প্রয়োজনীয় সুযোগে সীমাবদ্ধ করার অর্থ হ'ল আপনি দুর্ঘটনাক্রমে কোনও বন্ধ if ifstream অ্যাক্সেস করতে পারবেন না। তবে এটি কিছুটা স্বীকৃত।
অন্ধকার

9
সি ++ এ নেস্টেড স্কোপগুলি প্রায় কখনও অপ্রয়োজনীয় হয় না। কোডটির আচরণের সাথে তাদের সবকিছু করার রয়েছে, বিশেষত যখন কোনও কিছু ছুড়ে দেয়। যদি কোনও ভবিষ্যতের রক্ষণাবেক্ষণকারী তাদের সরিয়ে দেয় তবে তিনি সি ++ খুব ভাল জানেন না।
এলিয়ট ক্যামেরন

2
কখনও কখনও close()ত্রুটি পরিচালনার জন্য আপনাকে ম্যানুয়ালি কল করতে হবে ।
ks1322

71

আপনার কি ফাইলটি বন্ধ করা দরকার?
কোন

আপনার ফাইলটি বন্ধ করা উচিত?
নির্ভর করে।

ফাইলটি সঠিকভাবে বন্ধ করতে ব্যর্থ হলে এমন সম্ভাব্য ত্রুটি অবস্থার বিষয়ে আপনি কি যত্নশীল? setstate(failbit)যদি ব্যর্থ হয় তবে বন্ধ কলগুলি মনে রাখবেন । ধ্বংসকারী ডাকবেclose()ডিআরস্ট্রাক্টর আপনাকে আরআইআই-এর কারণে স্বয়ংক্রিয়ভাবে করবে কিন্তু অবজেক্টটির অস্তিত্ব নেই বলে ব্যর্থ বিটটি পরীক্ষা করার উপায় ছেড়ে দেবে না।


14

আমি @ মার্টিনের সাথে একমত আপনি যদি ফাইলটিতে লিখেন তবে ডেটা এখনও বাফারে বসে থাকতে পারে এবং কল না দেওয়া পর্যন্ত ফাইলটিতে লিখিত নাও হতে পারে close()। ম্যানুয়ালি এটি না করে, আপনার কোনও ত্রুটি ছিল কিনা তা কোনও ধারণা নেই। কোনও ব্যবহারকারীকে ত্রুটিগুলি না জানানো একটি খুব খারাপ অভ্যাস।


5

না, এটি স্বয়ংক্রিয়ভাবে ifstreamধ্বংসকারী দ্বারা সম্পন্ন করা হয় । আপনাকে এটিকে ম্যানুয়ালি কল করার একমাত্র কারণ, fstreamউদাহরণটির একটি বড় সুযোগ রয়েছে, উদাহরণস্বরূপ যদি এটি একটি দীর্ঘ জীবিত শ্রেণীর উদাহরণের সদস্য পরিবর্তনশীল হয়।


4
অন্য কারণটি হ'ল ফাইল-বন্ধকরণের ত্রুটিগুলি পরীক্ষা করা এবং স্ট্রিমের সাথে ব্যতিক্রম অনুমোদিত হলে, ডেস্ট্রাক্টর নিক্ষেপ করা রোধ করা।
ড্যানিয়েল ল্যাঙ্গার

4

আপনি ধ্বংসকারীকে এটির কাজটি করার অনুমতি দিতে পারেন। তবে যে কোনও 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);
}

না। এটি বিরল ক্ষেত্রে যেখানে কোনও প্রক্রিয়া হঠাৎ প্রস্থান করে its একটি ক্র্যাশিং প্রক্রিয়া একই রকম করতে পারে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.