সি ফপেন বনাম খোলা


219

এমন কোনও কারণ আছে (সিনট্যাকটিক বাদে) যা আপনি ব্যবহার করতে চান?

FILE *fdopen(int fd, const char *mode);

অথবা

FILE *fopen(const char *path, const char *mode);

পরিবর্তে

int open(const char *pathname, int flags, mode_t mode);

লিনাক্স পরিবেশে সি ব্যবহার করার সময়?


আপনি কি বোঝাতে চেয়েছেন fdopenএবং openবা fopenএবং open?
ব্যবহারকারী 7116

আপনি fopen না মানে, fdopen না?
সর্বময়

9
fopenএটি স্ট্যান্ডার্ড সি লাইব্রেরির অংশ, openনয়। fopenপোর্টেবল কোড লেখার সময় ব্যবহার করুন ।
আজিজ

হ্যাঁ, আমি ফপেনকে বুঝিয়েছি। আমি কেবল এটি আপডেট করেছি, তবে আমি মনে করি একই নীতিটি প্রযোজ্য।
এলজেএম

6
@ আজিজ, openযদিও পসিক্স ফাংশন।
ড্রিমলাক্স

উত্তর:


242

প্রথমত, ব্যবহার করার কোনও বিশেষ করে ভাল কারণ নেই fdopenযদি fopenএকটি বিকল্প নেই এবং openঅন্যান্য সম্ভাব্য পছন্দ। আপনি openযদি চান তবে প্রথমে আপনার ফাইলটি খুলতে হবে না FILE *। সুতরাং fdopenসেই তালিকাটি অন্তর্ভুক্ত করা ভুল এবং বিভ্রান্তিকর কারণ এটি অন্যদের মতো খুব বেশি নয়। আমি এখন এটিকে অগ্রাহ্য করতে এগিয়ে চলেছি কারণ এখানে গুরুত্বপূর্ণ পার্থক্যটি একটি সি স্ট্যান্ডার্ড FILE *এবং একটি ওএস-নির্দিষ্ট ফাইল বর্ণনাকারীর মধ্যে।

fopenপরিবর্তে ব্যবহার করার জন্য চারটি প্রধান কারণ রয়েছে open

  1. fopenআপনাকে বাফারিং আইও সরবরাহ করে যা আপনি যা করছেন তার থেকে অনেক দ্রুত হতে পারে open
  2. fopen ফাইলটি বাইনারি মোডে না খুললে লাইন শেষের অনুবাদটি করে, যা আপনার প্রোগ্রামটি যদি কখনও ইউনিক্স-বিহীন পরিবেশে পোর্ট করা থাকে তবে এটি খুব সহায়ক হতে পারে (যদিও বিশ্বটি কেবল এলএফ-তে রূপান্তরিত হয় বলে মনে হচ্ছে (আইইটিএফ পাঠ্য-ভিত্তিক নেটওয়ার্কিং ব্যতীত) প্রোটোকল যেমন এসএমটিপি এবং এইচটিটিপি এবং যেমন))।
  3. FILE *আপনাকে ব্যবহার করার ক্ষমতা fscanfএবং অন্যান্য স্টডিও ফাংশন দেয়।
  4. আপনার কোডটি একদিন অন্য কোনও প্ল্যাটফর্মের পোর্ট করা হতে পারে যা কেবল এএনএসআই সি সমর্থন করে এবং openফাংশনটি সমর্থন করে না ।

আমার মতে লাইনটি শেষ হওয়া অনুবাদটি প্রায়শই আপনার পথে আসে যা আপনাকে সহায়তা করে এবং তার পার্সিং fscanfএতটাই দুর্বল যে আপনি অবশ্যম্ভাবীভাবে এটিকে আরও দরকারী কোনও উপকারের পক্ষে টস করতে শুরু করেছিলেন।

এবং বেশিরভাগ প্ল্যাটফর্মগুলি সি সমর্থন করে যা একটি openফাংশন রয়েছে।

এটি বাফারিংয়ের প্রশ্ন ছেড়ে দেয়। যে জায়গাগুলিতে আপনি প্রধানত ক্রমানুসারে ফাইল পড়ছেন বা লিখছেন সেখানে বাফারিং সমর্থনটি সত্যিই সহায়ক এবং একটি বড় গতির উন্নতি। তবে এটি কিছু আকর্ষণীয় সমস্যার মধ্যে নিয়ে যেতে পারে যেখানে আপনি যখন এটি আশা করবেন তখন ফাইলটি ডেটা শেষ হয় না। আপনাকে উপযুক্ত সময়ে fcloseবা মনে রাখতে হবে fflush

আপনি যদি সিকস করছেন (ওরফে fsetposবা fseekযার দ্বিতীয়টি কোনও মান মেনে চলার উপায়ে ব্যবহার করতে কিছুটা কৌশলযুক্ত), বাফারিংয়ের উপযোগিতা দ্রুত হ্রাস পাবে।

অবশ্যই, আমার পক্ষপাতিত্ব হ'ল আমি সকেটগুলির সাথে পুরোপুরি কাজ করার ঝোঁক করি এবং সেখানে সত্যই আপনি সত্যই নন-ব্লকিং আইও করতে চান (যা FILE *সম্পূর্ণরূপে কোনও যুক্তিসঙ্গতভাবে সমর্থন করতে ব্যর্থ হয়) বিনা বাধায় with জটিল বিশ্লেষণের প্রয়োজনীয়তাগুলি সত্যিই আমার উপলব্ধিগুলিকে রঙ করে।


4
আমি আপনার অভিজ্ঞতাগুলি নিয়ে প্রশ্ন তুলছি না, তবে আমি আপনাকে এই সম্পর্কে কিছুটা বিস্তারিত শুনে শুনতে চাই। কোন ধরণের অ্যাপ্লিকেশনগুলির জন্য আপনি মনে করেন যে বিল্ট-ইন বাফারিংটি এভাবে চলে যায়? ঠিক সমস্যা কি?
এমিল এইচ

1
শেষ অনুচ্ছেদটি দেখেনি। বৈধ পয়েন্ট, আইএমএইচও। যতদূর আমি প্রশ্নটি বলতে পারি ফাইল আইও সম্পর্কে ছিল, যদিও।
এমিল এইচ

7
বাফারিংয়ের পথে কী হবে তা স্পষ্ট করা। এটি যখন আপনি সন্ধান ব্যবহার করেন। যাই হোক না কেন কমান্ড সাথে নিম্নলিখিত পড়ুন ( fgets, fgetc, fscanf, fread), সবসময় বাফার (4K, 8K বা যাই হোক না কেন আপনি সেট) সমগ্র আকার পড়বে। সরাসরি আই / ও ব্যবহার করে আপনি এড়াতে পারবেন। preadসেক্ষেত্রে সিক / রিড জুটির পরিবর্তে (2 এর পরিবর্তে 1 সিস্কেল) ব্যবহার করা আরও ভাল ।
প্যাট্রিক Schlüter 13

2
বাধা read()এবং write()কল পরিচালনা করা ফাংশনগুলির libc পরিবারকে ব্যবহার করার জন্য একটি সুবিধাজনক পঞ্চম কারণ।
এনসিসিসি

3
@ এম-রিচ: আচ্ছা, এটি কিছুটা সম্পর্কিত নয়, তবে হ্যাঁ। সমস্ত প্ল্যাটফর্ম যা সমর্থন করে ioctlসেই filenoকলটিকে সমর্থন করে যা একটি গ্রহণ করে FILE *এবং একটি ioctlকলটি ব্যবহৃত হতে পারে এমন একটি নম্বর ফেরত দেয় । যদিও সাবধান। FILE *সম্পর্কিত কলগুলি ioctlঅন্তর্নিহিত ফাইল বিবরণকারী সম্পর্কে কিছু পরিবর্তন করতে ব্যবহার করে আশ্চর্যরূপে যোগাযোগ করতে পারে ।
সর্বগ্রাহী

53

open()এটি একটি নিম্ন-স্তরের ওএস কল। fdopen()একটি ওএস-স্তরের ফাইল বর্ণনাকারীকে সি ভাষার উচ্চ-স্তরের ফাইল-বিমূর্তিতে রূপান্তরিত করে। পটভূমিতে fopen()কল open()করে এবং আপনাকে সরাসরি একটি ফাইল-পয়েন্টার দেয়।

ফাইল-অবজেক্টগুলি বরং কাঁচা ফাইল বর্ণনাকারী ব্যবহার করার বিভিন্ন সুবিধা রয়েছে যার মধ্যে ব্যবহারের সহজতরতা অন্তর্নিহিত বাফারিংয়ের মতো অন্যান্য প্রযুক্তিগত সুবিধাও অন্তর্ভুক্ত রয়েছে। বিশেষত বাফারিংয়ের ফলে সাধারণত একটি আকারের পারফরম্যান্স সুবিধা পাওয়া যায়।


3
বাফার 'এফ ...' সংস্করণগুলি উন্মুক্ত ব্যবহারের কোনও অসুবিধা আছে কি?
এলজেএম

5
@L। মোসার, হ্যাঁ, আপনি যখন ইতিমধ্যে ডেটা বাফার করছেন, এবং তাই অতিরিক্ত বাফার অপ্রয়োজনীয় অনুলিপি এবং মেমরির ওভারহেড যুক্ত করে।
মাইকেল অ্যারন সাফিয়ান

6
আসলে অন্যান্য অসুবিধাও আছে fopen()ফাইলগুলি খোলার সময় একই স্তরের নিয়ন্ত্রণ সরবরাহ করে না, উদাহরণস্বরূপ অনুমতিগুলি ভাগ করে নেওয়ার পদ্ধতি এবং আরও অনেক কিছু। open()অপারেটিং সিস্টেমটি যা সরবরাহ করে তার কাছাকাছিভাবে সাধারণত এবং বৈকল্পগুলি আরও অনেক বেশি নিয়ন্ত্রণ সরবরাহ করে
ম্যাট জেন্ডার

2
আপনি mmapযে ফাইলগুলি ফাইল করেন এবং স্বাভাবিক আই / ও দিয়ে পরিবর্তন করেন (এমনটি অবিশ্বাস্য মনে হয় যতটা আমরা প্রকৃতপক্ষে আমাদের প্রকল্পে করি এবং প্রকৃত ভাল কারণেই), বাফারিংয়ের উপায়টিও রয়েছে There
প্যাট্রিক Schlüter

আপনি অন্যান্য সিস্টেমের ফাংশনগুলিও ব্যবহার করতে চাইতে পারেন, রিডহেড () এর মাধ্যমে পৃষ্ঠা ক্যাশে ফাইলগুলি প্রিলোড করার জন্য ওপেন () ব্যবহার করার মতো। আমার ধারণা, থাম্বের নিয়মটি হ'ল "ফোপেন ব্যবহার করুন যদি না আপনার একেবারে ওপেন () প্রয়োজন হয়", ওপেন () আসলে আপনাকে অভিনব স্টাফ করতে দেয় (সেটিং / ও_টাইম সেট এবং অনুরূপ নয়) do
টমাস প্রুজিনা

34

ফপেন বনাম খোলা সি

1) fopenএকটি হল লাইব্রেরি ফাংশন যখন openএকটি হল সিস্টেম কল

2) fopenপ্রদান করে বাফার আই যা দ্রুত তুলনা করা হয় openযা অ বাফার

3) fopenহয় পোর্টেবল যখন openনা পোর্টেবল ( খোলা পরিবেশে নির্দিষ্ট )।

4) fopenএকটি ফাইল কাঠামোতে একটি পয়েন্টার ফিরিয়ে দেয় (ফাইল *) ; openএকটি পূর্ণসংখ্যা প্রদান করে যা ফাইলটি সনাক্ত করে।

5) এ FILE *আপনাকে fscanf এবং অন্যান্য stdio ফাংশন ব্যবহার করার ক্ষমতা দেয় ।


9
openএকটি
পসিক্স

12

আপনি যদি 0.1% অ্যাপ্লিকেশনগুলির অংশ না হন তবে যেখানে ব্যবহার openহ'ল আসল পারফরম্যান্স বেনিফিট হয় না, ব্যবহার না করার সত্যিই কোনও ভাল কারণ নেই fopen। যতদূর fdopenসংশ্লিষ্ট হয়, যদি আপনি ফাইল বর্ণনাকারী সঙ্গে বাজানো হয় না, আপনি যে কল প্রয়োজন হবে না।

দিয়ে বিদ্ধ fopenও পদ্ধতি তার পরিবার ( fwrite, fread, fprintf, এট) এবং আপনি খুব সন্তুষ্ট হবেন। ঠিক তেমনি গুরুত্বপূর্ণ, অন্যান্য প্রোগ্রামাররা আপনার কোড দিয়ে সন্তুষ্ট হবে।


11

আপনি যদি একটি থাকে তাহলে FILE *তোমার মতোই ফাংশন ব্যবহার করতে পারেন fscanf, fprintfএবং fgetsইত্যাদি আপনি শুধু ফাইল বর্ণনাকারী থাকে, তাহলে আপনি সীমিত (কিন্তু সম্ভবত দ্রুততর) ইনপুট এবং আউটপুট রুটিন read, writeইত্যাদি


7

খোলামেলা, পড়ুন, লেখার অর্থ আপনাকে সিগন্যাল ইন্ট্যারাপশন সম্পর্কে চিন্তা করতে হবে।

যদি কোনও সংকেত হ্যান্ডলারের মাধ্যমে কলটি বাধাগ্রস্ত হয় তবে ফাংশনগুলি -1 ফিরে আসবে এবং EINTR এ ত্রুটি স্থাপন করবে।

সুতরাং একটি ফাইল বন্ধ করার সঠিক উপায় হবে

while (retval = close(fd), retval == -1 && ernno == EINTR) ;

4
কারণ closeএটি অপারেটিং সিস্টেমের উপর নির্ভর করে। লিনাক্স, এআইএক্স এবং অন্যান্য কয়েকটি অপারেটিং সিস্টেমে লুপ করা ভুল।
strcat

তদ্ব্যতীত, পঠন এবং লিখন ব্যবহার করা একই সমস্যার মুখোমুখি হবে, অর্থাত্ সম্পূর্ণরূপে ইনপুট / আউটপুট প্রক্রিয়াজাত করার আগে তারা সংকেত দ্বারা বাধাগ্রস্থ হতে পারে এবং প্রোগ্রামারকে এই জাতীয় পরিস্থিতিগুলি পরিচালনা করতে হয়, যখন ফ্রেড এবং ফ্রি-রাইট হ্যান্ডেল সংকেত বাধাগুলি দুর্দান্তভাবে পরিচালনা করতে হয়।
মার্সেলো

6

open()এটি একটি সিস্টেম কল এবং ইউনিক্স-ভিত্তিক সিস্টেমগুলির জন্য নির্দিষ্ট এবং এটি একটি ফাইল বর্ণনাকারী দেয়। আপনি write()অন্য একটি সিস্টেম কল যা ব্যবহার করে একটি ফাইল বর্ণনাকারীর কাছে লিখতে পারেন ।
fopen()একটি এএনএসআই সি ফাংশন কল যা কোনও ফাইল পয়েন্টার দেয় এবং এটি অন্যান্য ওএসে বহনযোগ্য। আমরা একটি ফাইল পয়েন্টার ব্যবহার করে লিখতে পারি fprintf

ইউনিক্সে:
আপনি ফাইল বর্ণনাকারী থেকে এটি ব্যবহার করে একটি ফাইল পয়েন্টার পেতে পারেন:

fP = fdopen(fD, "a");

আপনি এটি ব্যবহার করে ফাইল পয়েন্টার থেকে একটি ফাইল বর্ণনাকারী পেতে পারেন:

fD = fileno (fP);

4

খোলা () ফপেন () পরিবারের প্রতিটি কার্যক্রমে শেষে ডাকা হবে called ওপেন () হ'ল একটি সিস্টেম কল এবং ফপেন () লাইব্রেরিগুলি ব্যবহারকারীর সহজলভ্যতার জন্য মোড়ক ফাংশন হিসাবে সরবরাহ করে


2

আমি আমার অ্যাপ্লিকেশনটির জন্য ফোপেন () থেকে () খুলতে পরিবর্তিত হয়েছি, কারণ ফপেন প্রতিবার ডাবল পড়ার কারণ হচ্ছিল যখন আমি ফপেন fgetc চালাতাম। ডাবল রিডগুলি আমি অর্জন করার চেষ্টা করছিলাম তা ব্যাহত করেছিল। ওপেন () কেবল আপনি যা চাইবেন তা করতে পারে বলে মনে হচ্ছে।


2

কোন পতাকা খোলার প্রয়োজন তাও নির্ভর করে। উপরের যুক্তি অনুসারে লেখার জন্য এবং পড়ার জন্য ব্যবহারের ক্ষেত্রে (এবং বহনযোগ্যতা) চ * ব্যবহার করা উচিত।

তবে যদি মূলত স্ট্যান্ডার্ড ফ্ল্যাগের (আরডাব্লু এবং অ্যাংড ফ্ল্যাগের মতো) চেয়ে বেশি নির্দিষ্ট করতে চান তবে আপনাকে প্ল্যাটফর্মের জন্য নির্দিষ্ট এপিআই (পসিক্স খোলা মতো) বা একটি লাইব্রেরি ব্যবহার করতে হবে যা এই বিবরণগুলিকে বিমূর্ত করে দেয়। সি-স্ট্যান্ডার্ডের এমন কোনও পতাকা নেই।

উদাহরণস্বরূপ আপনি কোনও ফাইল খুলতে চাইতে পারেন, কেবল যদি এটি প্রস্থান করে। আপনি যদি তৈরি পতাকাটি নির্দিষ্ট না করেন তবে অবশ্যই ফাইলটি বিদ্যমান থাকতে হবে। যদি আপনি তৈরি করতে একচেটিয়া যোগ করেন তবে এটি কেবল উপস্থিত থাকলে ফাইলটি তৈরি করবে। আরও অনেক আছে।

উদাহরণস্বরূপ, লিনাক্স সিস্টেমে সিস্টেফগুলির মাধ্যমে একটি এলইডি ইন্টারফেস উন্মুক্ত রয়েছে। এটি কোনও ফাইলের মাধ্যমে নেতৃত্বের উজ্জ্বলতা প্রকাশ করে। 0-255 থেকে শুরু করে স্ট্রিং হিসাবে একটি সংখ্যা লেখা বা পড়া। অবশ্যই আপনি এই ফাইলটি তৈরি করতে চান না এবং কেবল এটি উপস্থিত থাকলে এটি লিখুন। দুর্দান্ত জিনিস এখন: স্ট্যান্ডার্ড কলগুলি ব্যবহার করে এই ফাইলটি পড়তে / লিখতে fdopen ব্যবহার করুন।


0

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

1.firstly it searches on the disk the file to be opened.
2.then it loads the file from the disk into a place in memory called buffer.
3.it sets up a character pointer that points to the first character of the buffer.

এই আচরণকে প্রণালী হয় fopen ফাংশন
কিছু কারণ যখন বাফার উপলব্ধ প্রক্রিয়া, এটা timedout পারে আছে। সুতরাং ফোপনের তুলনায় (উচ্চ স্তরের আই / ও) খুলতে (নিম্ন স্তরের আই / ও) সিস্টেম কল, এবং এটি ফপেনের চেয়ে দ্রুততর উপযুক্ত ।


fopen চেয়ে দ্রুত খোলা হয়?
ওবায়হান

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