টিএল; ডিআর : ইওএফ কোনও চরিত্র নয়, এটি কোনও ম্যাক্রো কোনও ইনপুট-রিডিং ফাংশনটির নেতিবাচক রিটার্ন মূল্যায়নের জন্য ব্যবহৃত হয়। এক Ctrl+ অক্ষর Dপ্রেরণ করতে ব্যবহার করতে পারে EOT
যা ফাংশন রিটার্নকে বাধ্য করবে-1
প্রতিটি প্রোগ্রামারকে অবশ্যই আরটিএফএম করতে হবে
আসুন আমরা "সিএ রেফারেন্স ম্যানুয়াল" পড়ি, হার্বিসন এবং স্টিল দ্বারা, চতুর্থ সংস্করণ। 1995 থেকে, পৃষ্ঠা 317:
.ণাত্মক পূর্ণসংখ্যা ইওএফ এমন একটি মান যা কোনও "প্রকৃত চরিত্র" এর এনকোডিং নয়। । । উদাহরণস্বরূপ fget (বিভাগ 15.6) ফাইলের শেষে যখন EOF প্রদান করে, কারণ এখানে "আসল চরিত্র" পড়ার দরকার নেই।
মূলত EOF
কোনও চরিত্র নয়, বরং প্রতিনিধিত্ব করার জন্য একটি পূর্ণসংখ্যা মান প্রয়োগ করা stdio.h
হয় -1
। সুতরাং, কোসের উত্তর যতদূর যায় সঠিক, তবে এটি "খালি" ইনপুট গ্রহণের বিষয়ে নয়। গুরুত্বপূর্ণ নোটটি হ'ল এখানে ইওফ একটি আসল চরিত্রটিকে বোঝাতে নয়, রিটার্ন মান (এর getchar()
) তুলনা হিসাবে কাজ করে । man getchar
সমর্থন করে:
ফেরত মূল্য
fgetc (), getc () এবং getchar () ফাইল বা ত্রুটির শেষের পরে একটি স্বাক্ষরযুক্ত চর কাস্ট হিসাবে পড়া অক্ষরটি কোন int বা EOF এ ফেরত দেয়।
() এবং fgets () সাফল্যের সাথে ফিরে আসে, এবং কোনও ত্রুটি পড়েনি এমন সময় ত্রুটি বা ফাইলের সমাপ্তি ঘটে যখন NUL আসে।
ungetc () সাফল্যে সি প্রদান করে, বা EOF ত্রুটিতে।
while
লুপটি বিবেচনা করুন - এর প্রাথমিক উদ্দেশ্যটি যদি বন্ধনীগুলির শর্তটি সত্য হয় তবে ক্রিয়াকে পুনরাবৃত্তি করা । আবার দেখ:
while ((c = getchar ()) != EOF)
এটি মূলত বলেছে যদি c = getchar()
সফল কোড ফেরত দেয় (তবে 0
উপরে; এটি সাধারণ বিষয়) সফল কমান্ড চালানোর চেষ্টা করুন, echo $?
এবং তারপরে ব্যর্থ হন echo $?
এবং তারা ফিরে আসার সংখ্যা দেখুন)। সুতরাং আমরা যদি সাফল্যের সাথে চরিত্রটি পেতে এবং সি তে আশ্বাস দিই, প্রত্যাবর্তিত স্থিতি কোডটি 0 হয়, ব্যর্থ হয় -1। EOF
হিসাবে সংজ্ঞায়িত করা হয় -1
। সুতরাং যখন শর্ত -1 == -1
দেখা দেয় তখন লুপ বন্ধ হয়ে যায়। আর কখন হবে? যখন আর কোনও চরিত্র নেই, যখন c = getchar()
ব্যর্থ হয়। আপনি লিখতে পারেন while ((c = getchar ()) != -1)
এবং এটি এখনও কাজ করবে
এছাড়াও, আসল কোডে ফিরে যাওয়া যাক, এর একটি উদ্ধৃতি এখানে stdio.h
/* End of file character.
Some things throughout the library rely on this being -1. */
#ifndef EOF
# define EOF (-1)
#endif
এএসসিআইআই কোডস এবং ইওটি
যদিও ইওএফ অক্ষরটি প্রকৃত চরিত্র নয়, তবে একটি EOT
(ট্রান্সমিশনের সমাপ্তি) অক্ষর রয়েছে, যার ASCII দশমিক মান রয়েছে 04; এটি Ctrl+ Dশর্টকাটে লিঙ্কযুক্ত (মেটা চরিত্র হিসাবেও উপস্থাপিত ^D
)। টেলিফোন সংযোগগুলি নিয়ন্ত্রণ করার জন্য কম্পিউটারগুলি ব্যবহৃত হওয়ার পরে ট্রান্সমিশন ক্র্যাকারের সমাপ্তি ডেটা স্ট্রিমের সমাপ্তি বোঝাতে ব্যবহৃত হত, সুতরাং "সংক্রমণের শেষ" নামকরণ।
সুতরাং প্রোগ্রামের মতো সেই আসকি মানটি পাঠানো সম্ভব, $'\04'
কোনটি ইওটি নোট করুন :
skolodya@ubuntu:$ ./a.out <<< "a,b,c $'\04'"
digits = 1 0 0 0 1 0 0 0 0 0, white space = 2, other = 9
সুতরাং, আমরা বলতে পারি যে এটি বিদ্যমান আছে, তবে এটি মুদ্রণযোগ্য নয়
সাইড নোট
আমরা প্রায়শই ভুলে যাই যে অতীতে কম্পিউটারগুলি বহুমুখী ছিল না - ডিজাইনারদের প্রতিটি কীবোর্ড কী উপলব্ধ করে রাখতে হবে। সুতরাং, EOT
সিআরটিএলডি দিয়ে অক্ষর প্রেরণ করা এখনও "একটি চরিত্র প্রেরণ", এটি ক্যাপিটাল এ, শিফটএ টাইপ করার মতো নয়, আপনি এখনও কম্পিউটারকে উপলব্ধ কীগুলির সাথে একটি ইনপুট দিন give সুতরাং ইওটি হ'ল একটি বাস্তব চরিত্র যা এটি ব্যবহারকারীর কাছ থেকে আসে না, এটি কম্পিউটার দ্বারা পাঠযোগ্য (যদিও মুদ্রণযোগ্য নয়, মানুষের দ্বারা দৃশ্যমান নয়), এটি কম্পিউটারের মেমরিতে বিদ্যমান
বাইট কমান্ডারের মন্তব্য
আপনি যদি / dev / নাল থেকে পড়ার চেষ্টা করেন, তবে এটি একটি ইওএফও ফেরত দেওয়া উচিত, তাই না? বা আমি সেখানে কি পেতে পারি?
হ্যাঁ, ঠিক ঠিক আছে, কারণ এর মধ্যে /dev/null
কোন প্রকৃত চরিত্র পড়তে হবে আছে, অত এটা c = getchar()
ফিরে আসবে -1
কোড, এবং প্রোগ্রাম সরাসরি প্রস্থান করা হবে। আবার কমান্ড ইওএফ ফেরায় না। ইওএফ -1 এর সমান কেবল ধ্রুবক পরিবর্তনশীল, যা আমরা getchar ফাংশনের রিটার্ন কোডের সাথে তুলনা করতে ব্যবহার করি । EOF
চরিত্র হিসাবে বিদ্যমান নেই, এটি ভিতরে কেবল একটি স্থির মান stdio.h
।
ডেমো:
# cat /dev/null shows there's no readable chars
DIR:/xieerqi
skolodya@ubuntu:$ cat /dev/null | cat -A
# Bellow is simple program that will open /dev/null for reading. Note the use of literal -1
DIR:/xieerqi
skolodya@ubuntu:$ cat readNull.c
#include<stdio.h>
void main()
{
char c;
FILE *file;
file = fopen("/dev/null", "r");
if (file)
{
printf ("Before while loop\n");
while ((c = getc(file)) != -1)
putchar(c);
printf("After while loop\n");
fclose(file);
}
}
DIR:/xieerqi
skolodya@ubuntu:$ gcc readNull.c -o readNull
DIR:/xieerqi
skolodya@ubuntu:$ ./readNull
Before while loop
After while loop
কফিনের আরও একটি পেরেক
কখনও কখনও এটি প্রমাণ করার চেষ্টা করা হয় যে EOF এই জাতীয় কোড সহ একটি চরিত্র:
#include <stdio.h>
int main(void)
{
printf("%c", EOF);
return 0;
}
এর সাথে সমস্যা হ'ল চর ডেটাটাইপ হ'ল একটি স্বাক্ষরিত বা স্বাক্ষরযুক্ত মান। এছাড়াও এগুলি ক্ষুদ্রতম ঠিকানাযোগ্য ডেটাটাইপ যা মাইক্রোকন্ট্রোলারগুলিতে তাদের খুব দরকারী করে তোলে, যেখানে মেমরি সীমাবদ্ধ। তাই ঘোষণার পরিবর্তে int foo = 25;
ছোট মেমোরি char foo = 25;
বা অনুরূপ কিছু সহ মাইক্রোকন্ট্রোলারগুলিতে দেখা সাধারণ common এছাড়াও, চরগুলি স্বাক্ষরিত বা স্বাক্ষরযুক্ত হতে পারে ।
যে কোনও একটি প্রোগ্রামের সাথে বাইটের আকারটি যাচাই করতে পারে:
#include <stdio.h>
int main(void)
{
printf("Size of int: %lu\n",sizeof(int));
printf("Sieze of char: %lu\n",sizeof(char));
//printf("%s", EOF);
return 0;
}
skolodya@ubuntu:$ ./EOF
Size of int: 4
Sieze of char: 1
বিন্দু ঠিক কি? মুল বক্তব্যটি হ'ল ইওএফ -1 হিসাবে সংজ্ঞায়িত করা হয়েছে তবে চর ডেটাটাইপ পূর্ণসংখ্যা মানগুলি মুদ্রণ করতে পারে ।
ঠিক আছে . । .সেই আমরা স্ট্রিং হিসাবে চর প্রিন্ট করার চেষ্টা করি?
#include <stdio.h>
int main(void)
{
printf("%s", EOF);
return 0;
}
স্পষ্টতই একটি ত্রুটি, তবে তবুও ত্রুটিটি আমাদের আকর্ষণীয় কিছু বলবে:
স্কলড্যা @ উবুন্টু: $ জিসিসি ইওএফ.সি.ও-
ইওএফ ইওফ.সি .: ফাংশনে 'মেন': ইওফএসি: 4: 5: সতর্কতা: ফর্ম্যাট '% s' 'চর *' টাইপের আর্গুমেন্ট প্রত্যাশা করে, তবে আর্গুমেন্ট 2 রয়েছে টাইপ করুন 'ইনট'
[-Wformat =] প্রিন্টফ ("% s", ইওএফ);
হেক্স মান
ইওএফকে হেক্স মান হিসাবে মুদ্রণ করা FFFFFFFF
, একটি 16 বিট (8 বাইট) মান, দুটির প্রশংসা এ -1
।
#include <stdio.h>
int main(void)
{
printf("This is EOF: %X\n", EOF);
printf("This is Z: %X\n",'Z');
return 0;
}
আউটপুট:
DIR:/xieerqi
skolodya@ubuntu:$ ./EOF
This is EOF: FFFFFFFF
This is Z: 5A
আরও একটি কৌতূহলী জিনিস নিম্নলিখিত কোড সহ ঘটে:
#include <stdio.h>
int main(void)
{
char c;
if (c = getchar())
printf ("%x",c);
return 0;
}
যদি একটি টিপুন Shift+ A, আমরা হেক্স মান 41 পাই, স্পষ্টতই ASCII টেবিলের মতো। কিন্তু জন্য Ctrl+ + D, আমরা ffffffff
আবার, - ফেরত মান getchar()
সঞ্চিত c
।
DIR:/xieerqi
skolodya@ubuntu:$ gcc EOF.c -o ASDF.asdf
DIR:/xieerqi
skolodya@ubuntu:$ ./ASDF.asdf
A
41
DIR:/xieerqi
skolodya@ubuntu:$ ./ASDF.asdf
ffffffff
অন্যান্য ভাষাগুলি দেখুন
লক্ষ্য করুন যে অন্য ভাষা এই বিভ্রান্তি এড়ায়, কারণ তারা কোনও ম্যাক্রোর সাথে তুলনা না করে কোনও ফাংশন প্রস্থান স্থিতির মূল্যায়নের উপর কাজ করে। জাভাতে একজন কীভাবে ফাইল পড়তে পারে?
File inputFile = new File (filename);
Scanner readFile = new Scanner(inputFile);
while (readFile.hasNext())
{ //more code bellow }
অজগর সম্পর্কে কীভাবে?
with open("/etc/passwd") as file:
for line in file:
print line
-1
EOF এর সমতুল্য।/usr/include/stdio.h
এটিকে ম্যাক্রো ধ্রুবক হিসাবে সংজ্ঞায়িত করা হয়েছে