ইওএফ (ফাইলের সমাপ্তি) অক্ষর একটি চরকে সংরক্ষণ করা


11

আমি ডেনিস রিচি'র দ্য সি প্রোগ্রামিং ল্যাঙ্গুয়েজ বইটিতে পড়েছি যেটি intইওএফ রাখার জন্য একটি ভেরিয়েবলের জন্য অবশ্যই ব্যবহার করতে হবে - এটি পর্যাপ্ত পরিমাণে বড় করতে যাতে এটি ইওফের মান ধরে রাখতে পারে - না char। তবে নিম্নলিখিত কোডটি সূক্ষ্মভাবে কাজ করে:

#include<stdio.h> 

main()  { 
  char c; 
  c=getchar(); 
  while(c!=EOF)  { 
    putchar(c); 
    c=getchar(); 
  } 
} 

যখন আর কোনও ইনপুট না থাকে, তখন getcharইওএফ ফেরত দেয়। এবং উপরের প্রোগ্রামে ভেরিয়েবল c, চরের টাইপ সহ এটি সফলভাবে ধরে রাখতে সক্ষম।

কেন এই কাজ করে? উল্লিখিত বইয়ের ব্যাখ্যা অনুসারে কোডটি কাজ করা উচিত নয়।



5
আপনি মান সহ একটি অক্ষর পড়লে এই কোডটি ব্যর্থ হতে পারে 0xff। ফল সংরক্ষণ getchar()একটি ইন intসমাধান যে সমস্যা। আপনার প্রশ্নটি মূলত কম.আর.এল.এফ.এফ.কিউ.এ প্রশ্নে 12.1 প্রশ্নের সমান , যা একটি দুর্দান্ত উত্স excellent (এছাড়াও, main()হওয়া উচিত int main(void)এবং এটি return 0;বন্ধ হওয়ার আগে একটি যোগ করা ক্ষতিগ্রস্থ হবে না }))
কীথ থম্পসন

1
@ ডেলান: লিঙ্কিত নিবন্ধটি ইউনিক্স কীভাবে নিয়ন্ত্রণ-ডি আচরণ করে তা সম্পর্কে সঠিক নয়। এটি ইনপুট স্ট্রিমটি বন্ধ করে না; এটি কেবল যে কোনও ফ্রিড () যা কনসোলে অবরুদ্ধ করে তা অবিলম্বে কোনও অ-এখনও অপঠিত ডেটা সহ ফিরিয়ে দেয় causes অনেক প্রোগ্রাম ইওএফটিকে ইঙ্গিত করে ফ্রেড () থেকে শূন্য-বাইট রিটার্ন ব্যাখ্যা করে তবে ফাইলটি প্রকৃতপক্ষে উন্মুক্ত থাকবে এবং আরও ইনপুট সরবরাহ করতে সক্ষম হবে।
সুপারক্যাট

উত্তর:


11

আপনার কোডটি কাজ করে বলে মনে হচ্ছে, কারণ অন্তর্নিহিত ধরণের রূপান্তরগুলি ঘটনাক্রমে সঠিক কাজটি ঘটায়।

getchar()intএমন একটি মানের সাথে প্রত্যাবর্তন করে যা হয় হয় unsigned charবা তার পরিসীমা ফিট করে EOF(যা নেতিবাচক হতে হবে, সাধারণত এটি -1 হয়)। মনে রাখবেন যে EOFনিজে নিজেই কোনও চরিত্র নয়, তবে এমন একটি সংকেত যে আরও কোনও অক্ষর উপলব্ধ নেই।

যখন থেকে ফলাফলের সংরক্ষণকারী getchar()মধ্যে c, দুই সম্ভাবনা রয়েছে। হয় টাইপটি charমানটির প্রতিনিধিত্ব করতে পারে, সেই ক্ষেত্রে এটির মান c। বা প্রকারটি মান উপস্থাপন char করতে পারে না । সেক্ষেত্রে কী হবে তা নির্ধারণ করা হয়নি। ইন্টেল প্রসেসরগুলি কেবলমাত্র উচ্চ ধরণের বিটগুলি কেটে ফেলবে যা নতুন ধরণের সাথে খাপ খায় না (কার্যকরভাবে মান মডুলো 256 এর জন্য হ্রাস করে char), তবে আপনার উপর নির্ভর করা উচিত নয়।

পরবর্তী পদক্ষেপের সাথে তুলনা করা cহয় EOF। যেমনটি EOFএকটি int, cতেও রূপান্তরিত হবে int, এতে সঞ্চিত মান সংরক্ষণ করে c। যদি cমানটি সংরক্ষণ করতে পারে EOFতবে তুলনাটি সফল হবে তবে মানটি সংরক্ষণ cকরতে না পারলে তুলনাটি ব্যর্থ হবে, কারণ EOFটাইপে রূপান্তর করার সময় তথ্যের একটি অপরিবর্তনযোগ্য ক্ষতি হয়েছে char

দেখে মনে হচ্ছে আপনার সংকলকটি charস্বাক্ষরিত ধরণের এবং উপযুক্ত মানের জন্য EOFযথেষ্ট পরিমাণের মানটি তৈরি করতে বেছে নিয়েছে char। তাহলে charস্বাক্ষরবিহীন হয় (অথবা যদি আপনি ব্যবহার করেছিল unsigned char), আপনার পরীক্ষা, ব্যর্থ হয়েছে কারণ unsigned charএর মান রাখা যাবে না EOF


এছাড়াও মনে রাখবেন যে আপনার কোডে দ্বিতীয় সমস্যা রয়েছে। যেমন EOFএকটি চরিত্র নিজেই নয়, তবে আপনি এটিকে একটি charধরণের মধ্যে জোর করেছেন , খুব সম্ভবত সেখানে একটি চরিত্র রয়েছে যা ভুল হিসাবে ব্যাখ্যা করা হয়ে থাকে EOFএবং অর্ধেক সম্ভাব্য অক্ষরের জন্য এটি সঠিকভাবে প্রক্রিয়া করা হবে কিনা তা অপরিবর্তিত রয়েছে।


charসীমার বাইরে মানগুলি টাইপ করতে বাধ্য করা CHAR_MIN.. উইলের CHAR_MAXএকটি হয় বাস্তবায়ন-সংজ্ঞায়িত মান অর্জন করতে হবে, একটি বিট প্যাটার্ন প্রদান করা হবে যা বাস্তবায়ন ট্র্যাপের প্রতিনিধিত্ব হিসাবে সংজ্ঞায়িত করে বা বাস্তবায়ন-সংজ্ঞায়িত সংকেত বাড়াতে পারে। বেশিরভাগ ক্ষেত্রে, বাস্তবায়নগুলিকে দু'জনের পরিপূরক হ্রাস ব্যতীত অন্য কিছু করার জন্য প্রচুর অতিরিক্ত কাজ করতে হবে। যদি স্ট্যান্ডার্ড কমিটির লোকেরা এই ধারণার জন্য সাবস্ক্রাইব করেন যে
সংকলকরা

... আমি এই ধরনের জবরদস্তাকে নির্ভরযোগ্য হিসাবে বিবেচনা করব (এটি বলার অপেক্ষা রাখে না যে কোডটি তার উদ্দেশ্যগুলি নথিভুক্ত করা উচিত নয়, তবে (signed char)xএটিকে আরও পরিষ্কার এবং ঠিক ততটা নিরাপদ হিসাবে বিবেচনা করা উচিত ((unsigned char)x ^ CHAR_MAX+1))-(CHAR_MAX+1),) এটি যেমন আছে তেমন কোনও সম্ভাবনা আমি দেখছি না don't আজকের স্ট্যান্ডার্ডের সাথে সম্মতিযুক্ত অন্য কোনও আচরণ বাস্তবায়নের সংকলকগণ; এক বিপদটি হ'ল "অপ্টিমাইজেশন" এর অনুমিত আগ্রহের মধ্যে আচরণটি ভাঙ্গার জন্য মানকটি পরিবর্তন করা যেতে পারে।
সুপারক্যাট

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

Orতিহাসিকভাবে, স্ট্যান্ডার্ডটির অভিপ্রায়টি বেশিরভাগ ক্ষেত্রে আপনার বর্ণনা অনুসারে ছিল, যদিও স্ট্যান্ডার্ডটি কিছু আচরণের বর্ণনা দেয় যাতে কিছু সাধারণ প্ল্যাটফর্মের জন্য একটি আলগা স্পেসিফিকেশনের অধীনে প্রয়োজনীয় কোডের চেয়ে বেশি কোড উত্পন্ন করতে সংকলক প্রয়োজন require ধরণের জবরদস্তি int i=129; signed char c=i;হ'ল এই জাতীয় আচরণ। তুলনামূলকভাবে খুব কম প্রসেসরের একটি নির্দেশ থাকে যা এটি -127 থেকে +127 এর মধ্যে থাকে এবং cসমান iহবে i-128 থেকে +127 পরিসরে যে দুটি মানের পরিপূরক হ্রাস, বা থেকে পৃথক হবে তার মানগুলির সাথে অন্য কোনও মানের সামঞ্জস্যপূর্ণ ম্যাপিং দেবে or ..
সুপারক্যাট

... এই জাতীয় ক্ষেত্রে ধারাবাহিকভাবে একটি সংকেত উত্থাপন করা হবে। স্ট্যান্ডার্ডটির যেহেতু বাস্তবায়নগুলি হয় একটি সামঞ্জস্যপূর্ণ ম্যাপিং দেয় বা ধারাবাহিকভাবে একটি সংকেত উত্থাপন করে, একমাত্র প্ল্যাটফর্ম যেখানে স্ট্যান্ডার্ড দুটির পরিপূরক হ্রাস ব্যতীত অন্য কোনও কিছুর জন্য জায়গা ছেড়ে দেবে তা হ'ল স্যাচুরটিং-গাণিতিক হার্ডওয়্যারযুক্ত ডিএসপিগুলির মতো জিনিস। অনির্ধারিত আচরণের historicalতিহাসিক ভিত্তি হিসাবে, আমি বলব যে সমস্যাটি কেবল হার্ডওয়্যার প্ল্যাটফর্মের সাথে নয়। এমনকি এমন একটি প্ল্যাটফর্মে যেখানে ওভারফ্লো খুব সামঞ্জস্যপূর্ণ ফ্যাশনে আচরণ করবে, এটি একটি সংকলক ফাঁদে ফেলতে দরকারী হতে পারে ...
সুপারক্যাট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.