সি ++ স্ট্যান্ডার্ড হ্যান্ডেল ফাইলটি কেন এরকম উপায় খুঁজছে?


17

সি ++ streamoffপ্রকারটি (ফাইল) স্ট্রিমের মধ্যে একটি অফসেট উপস্থাপন করতে ব্যবহার করে এবং [স্ট্রিম.টাইপস] এ নিম্নলিখিত হিসাবে সংজ্ঞায়িত করা হয়:

using streamoff = implementation-defined ;

অপারেটিং সিস্টেমের সর্বাধিক সম্ভাব্য ফাইল আকার উপস্থাপনের জন্য টাইপ স্ট্রিমোফ পর্যাপ্ত আকারের স্বাক্ষরিত মৌলিক অবিচ্ছেদ্য ধরণের একের সমার্থক শব্দ। 287)

287) সাধারণত দীর্ঘ দীর্ঘ।

এটি উপলব্ধি করে কারণ এটি বড় ফাইলগুলির মধ্যে অনুসন্ধানের অনুমতি দেয় (ব্যবহারের বিপরীতে long , যা কেবল 32 বিট প্রশস্ত হতে পারে)।

[filebuf.virtual] basic_filebufএকটি ফাইলের মধ্যে অনুসন্ধানের ক্রিয়াকে নিম্নলিখিত হিসাবে সংজ্ঞায়িত করেছে :

pos_type seekoff(off_type off, ios_base::seekdir way, ios_base::openmode which = ios_base::in | ios_base::out) override;

off_typeএর সমতুল্য streamoff, দেখুন [iostreams.limits.pos]। তবে, স্ট্যান্ডার্ডটি তখন ফাংশনের প্রভাবগুলি ব্যাখ্যা করতে চলেছে। আমি একেবারে শেষ বাক্যে বিরক্ত হয়েছি, যার জন্য এই কলটি দরকার fseek:

প্রভাবসমূহ : widthবোঝাতে দিন a_codecvt.encoding()। যদি is_open() == false, বা off != 0 && width <= 0, তাহলে পজিশনিং অপারেশন ব্যর্থ হয়। অন্যথায়, যদি way != basic_ios::curবা off != 0, এবং যদি শেষ অপারেশন আউটপুট ছিল, তবে আউটপুট ক্রম আপডেট করুন এবং কোনও আনশিফ্ট ক্রম লিখুন। এরপরে, নতুন অবস্থানের সন্ধান করুন: যদি width > 0, কল করুন fseek(file, width * off, whence), অন্যথায় কল করুন fseek(file, 0, whence)

fseekএকটি longপরামিতি গ্রহণ করে । যদি off_typeএবং streamoffসংজ্ঞায়িত করা হয় long long(মান হিসাবে প্রস্তাবিত), এটি longকল করার সময় ডাউন রূপান্তর হতে পারে fseek(file, width * off, whence)(বাগগুলি সনাক্তকরণে সম্ভাব্য শক্তির দিকে পরিচালিত করে)। এটি streamoffপ্রথমে প্রকারটি প্রবর্তনের পুরো যুক্তিটিকে প্রশ্নবিদ্ধ করে ।

এই ইচ্ছাকৃত বা মান একটি ত্রুটি?


8
ত্রুটি মত দেখাচ্ছে।
ইয়াক্ক - অ্যাডাম নেভ্রামুমন্ট

আমার মনে হয় আমি দেখতে পাই যে gcc libstdc ++ fseeko64 ব্যবহার করে
কামিলকুক

1
অফহ্যান্ড, এটি হুডের নীচে seekoffপ্রয়োজনীয় ব্যবহারের মতো বলে মনে হচ্ছে না fseek। বরং, (সম্ভবতঃ পরিচিত?) আচরণটি fseekকী seekoffকরছে তা বোঝাতে ব্যবহৃত হয় ।
jjramsey

@jjramsey এটি আমার প্রভাবও ছিল। তবে, এটি যেভাবে বর্ণিত হয়েছে তা ব্যাখ্যা করার পরিবর্তে কোনও প্রয়োজনের পরামর্শ দেয় to
jceed2

1
@jjramsey আমি সম্মত হই যে "ইফেক্টস" অংশটি যথাযথভাবে ব্যাখ্যা করা যেতে পারে যার অর্থ এটি হ'ল যতক্ষণ না fseekএটি প্রভাব ফেলবে যতক্ষণ না এটি একই প্রভাবের সাথে কিছু করে। তবে এর fseekচেয়ে কম LONG_MINবা তার চেয়ে বেশি কোনও অফসেটের LONG_MAXকোনও প্রভাব নেই, সুতরাং ব্যাখ্যাটি সর্বোপরি অসম্পূর্ণ, কমপক্ষে এর streamoffচেয়ে আরও প্রশস্ততর বাস্তবায়নের জন্য long
কিথ থম্পসন

উত্তর:


6

আমি মনে করি যে আপনি এ থেকে এই সিদ্ধান্তটি আঁকছেন যে সি ++ স্ট্রিমগুলির মধ্যে একটি মিল নেই এবং fseekএটি রানটাইম বাগগুলিতে নিয়ে যাবে, এটি ভুল। পরিস্থিতিটি মনে হয়:

  1. এমন সিস্টেমে যেখানে longb৪ বিট থাকে, streamoffসংজ্ঞায়িত করা হয় longএবং seekoffফাংশনটি প্রার্থনা করে fseek

  2. সিস্টেমে যেখানে long32 বিট কিন্তু ওএস সমর্থন 64 বিট ফাইল অফসেট হয় streamoffহিসাবে সংজ্ঞায়িত করা হয় long longএবং seekoffএকটি ফাংশন পারেন নামক ডাকে fseekoবা fseeko64যে গ্রহণ করে 64-বিট অফসেট।

seekoffআমার লিনাক্স সিস্টেমে সংজ্ঞা থেকে এখানে স্নিপেট দেওয়া হয়েছে :

#ifdef _GLIBCXX_USE_LFS
    if (!fseeko64(_M_file, __off, __whence))
      __ret = std::streampos(ftello64(_M_file));
#else
    if (!fseek(_M_file, __off, __whence))
      __ret = std::streampos(std::ftell(_M_file));
#endif

এলএফএস মানে লার্জ ফাইল সাপোর্ট

উপসংহার: যদিও মানটি একটি সংজ্ঞা প্রস্তাব করে streamoff প্রয়োজন যে সঙ্গে যে বাহ্যত দ্বন্দ্ব seekoffডাকা fseek, পাঠাগার ডিজাইনার বুঝি যে তারা কল করতে হবে এর বৈকল্পিক fseekযে যা OS সমর্থন অফসেট সম্পূর্ণ পরিসর গ্রহণ করে।


@ypnos আমি নীচে নামি নি এবং আমি এই উত্তরটি দরকারী বলে মনে করি। আমি অনুমান করি কেউ হ্রাস পেয়েছে কারণ এটি পয়েন্টটি মিস করে। সমস্যাটি হ'ল এই নয় যে এখানে বুদ্ধিমান বাস্তবায়ন রয়েছে যা এই ক্ষেত্রে মানটিকে অগ্রাহ্য করে, সমস্যাটি হ'ল বাস্তবাকে বুদ্ধিমান করার জন্য মানটিকে অবহেলা করা দরকার।
jceed2

6
The situation seems to be:- অবস্থা যে বাস্তবায়ন ডাকতে না জন্য অনুমতি দেওয়া হয়নি fseekমধ্যে seekoff। এটি অবশ্যই কল করবে fseek, এটি নয়, মানকটি বলেছে এটি করা উচিত। আমি যুক্তি দিতে পারি যে এই বাস্তবায়নটি অবৈধ। আমি বিশ্বাস করি এটি প্রশ্নের উত্তর দেয় না। ওচ পাওয়া llvm , এটা কল fseeko
কামিলকুক

ঠিক যেমন একটি এফওয়াইআই, ভিসি ++ _fseeki64এই ফাংশনটির জন্য কল করে; যা মান বলে যা লঙ্ঘন করে বলে মনে হয়।
ক্রিসএমএম

1
এটি প্রয়োগকারীরা সমস্যাটি উপলব্ধি করার এবং মানটিকে উপেক্ষা করার একটি ঘটনা is তারা খুশী আমি আনন্দিত, তবে মানকটি ঠিক করা দরকার।
নাথান অলিভার

1
কিছু লোক স্ট্যান্ডার্ডটি খুব আক্ষরিকভাবে নিচ্ছেন। এটি বাস্তবায়নের জন্য আক্ষরিকভাবে একটি ফাংশন কল করার দাবি করছে না fseek। অন্য কোথাও স্ট্যান্ডার্ডটি এমন কিছু হিসাবে বর্ণনা করে যা "কল করে যেন fseek(...)।" এটি যদি আক্ষরিক কল করার বিষয়ে এত যত্ন করে তবে সে fseekবক্তব্যটি আলাদা different সিরিয়াসলি, আপনি কী করবেন, যদি আপনি কোনও সি ++ লাইব্রেরি প্রয়োগ করেন? fseekকোনও ডকুমেন্ট আপনাকে বলছে বলে আপনি কি অফসেটের 64-বিট ফাইলের 32 টি বিট দিয়ে কল করার জন্য জেদ করবেন? আপনার গ্রাহকরা কি এর জন্য আপনাকে ধন্যবাদ জানাতে পারে?
উইলিস ব্ল্যাকবার্ন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.