ইওএফ কী এবং কীভাবে এটি ট্রিগার করবেন? [বন্ধ]


12

এটি আমার সি উত্স কোড।

আমি যখন এটি উবুন্টুতে তৈরি করি তখন এটি চরিত্র পেতে শুরু করে তবে প্রোগ্রামটি কীভাবে শেষ করতে হয় তা আমি জানি না, কারণ এটি ইনপুট ENTERবা গাড়ীর রিটার্ন দিয়ে শেষ হয় না ।

ইওএফ বলতে কী বোঝায়? আমি কীভাবে এটি ট্রিগার করতে পারি?

এই উত্সটি ডেনিস রিচি একটি বইতেও রয়েছে:

#include <stdio.h>
    /* count digits, white space, others */
main ()
{
  int c, i, nwhite, nother;
  int ndigit[10];
  nwhite = nother = 0;
  for (i = 0; i < 10; ++i)
    ndigit[i] = 0;
  while ((c = getchar ()) != EOF)
    if (c >= '0' && c <= '9')
      ++ndigit[c - '0'];
    else if (c == ' ' || c == '\n' || c == '\t')
      ++nwhite;
    else
      ++nother;
  printf ("digits =");
  for (i = 0; i < 10; ++i)
    printf (" %d", ndigit[i]);
  printf (", white space = %d, other = %d\n", nwhite, nother);
}

4
সি ভাষায় -1EOF এর সমতুল্য। /usr/include/stdio.hএটিকে ম্যাক্রো ধ্রুবক হিসাবে সংজ্ঞায়িত করা হয়েছে
এডওয়ার্ড টরভাল্ডস

1
প্রাসঙ্গিক পাঠ: স্ট্যাকওভারফ্লো.com
q/12389518

@edwardtorvalds লিখে -1যেমন ইনপুট কাজ করে না :)
Sergiy Kolodyazhnyy

আমি মনে করি একই ডেনিস রিচি বইটি এটি ব্যাখ্যা করে।
andy256

এছাড়াও প্রাসঙ্গিক: unix.stackexchange.com/questions/110240/… (এই প্রশ্নের পোস্ট করা উত্তরগুলির
কোনওোটাই

উত্তর:


23

TL; ড

আপনি শেষ ইনপুট ফ্লাশের ঠিক পরে CTRL+ + Dকীস্ট্রোক সহ টার্মিনালে চলমান একটি প্রোগ্রামে সাধারণত "ট্রিগার ইওএফ" করতে পারেন ।


ইওএফ বলতে কী বোঝায়? আমি কীভাবে এটি ট্রিগার করতে পারি?

ইওএফ মানে ফাইল-এর শেষে।

এই ক্ষেত্রে "ট্রিগারিং ইওএফ" এর অর্থ মোটামুটি "প্রোগ্রামটিকে সচেতন করে তোলা যে আর কোনও ইনপুট প্রেরণ করা হবে না"।

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

তবে এটি কেবলমাত্র আপনার নির্দিষ্ট প্রোগ্রামের জন্যই প্রযোজ্য না, এটি অনেকগুলি বিভিন্ন সরঞ্জামের ক্ষেত্রে প্রযোজ্য।

সাধারণভাবে "ট্রফিগার ইওএফ" শেষ ইনপুট ফ্লাশের ঠিক পরে (যেমন একটি খালি ইনপুট প্রেরণ করে) একটি CTRL+ Dকীস্ট্রোক দিয়ে করা যেতে পারে ।

উদাহরণস্বরূপ cat:

% cat >file # Hit ENTER
foo # Hit ENTER and CTRL+D
% 

কি ফণা যখন আঘাত অধীনে ঘটছে CTRL+ + Dযে ইনপুট শেষ ইনপুট ফ্লাশ যেহেতু টাইপ করা রাঙা হয়; এই একটি খালি ইনপুট হতে হবে read()প্রাপ্ত syscall প্রোগ্রামের stdin আয় আহ্বান 0, getchar()একটি ঋণাত্মক সংখ্যা (ফেরৎ -1গনুহ সি লাইব্রেরিতে) এবং এই পালা ফাইলের শেষে হিসেবে ব্যাখ্যা করা হয় 1


1 - /programming//a/1516177/4316166


2
সংকলন কাজ করে, কারণ একই লাইনে থাকার মাধ্যমে কমা সীমানা আবদ্ধ হয় না। এটি ছাড়াও,
ইওএফ এ

@ পলিয়াসুকুক হু, আপনি ঠিক বলেছেন আমার সি কিছুটা মরিচা। :)
কোস

1
আইরিক ইওএফ-কে স্ট্যান্ডার্ড অনুযায়ী -1 হিসাবে সংজ্ঞায়িত করা হয় না । এটি যেমন হ'ল উদাহরণস্বরূপ গ্লিবসিতে যা ঘটে।
লার্কি

1
@ আলারকি এটি সঠিক: gnu.org/software/libc/manual/html_node/EOF-and-Erferences.html
kos

1
ইওএফ '' খালি ইনপুট '' প্রেরণে গঠিত নয়, এবং আপনার উদ্ধৃত এসও উত্তরটি অন্যথায় বলে না। এটি ব্যান্ড সিগন্যাল একটি আউট। টার্মিনালের ক্ষেত্রে এটি Ctrl / d টাইপ করে প্রেরণ করা হয়।
ব্যবহারকারী 207421

4

টিএল; ডিআর : ইওএফ কোনও চরিত্র নয়, এটি কোনও ম্যাক্রো কোনও ইনপুট-রিডিং ফাংশনটির নেতিবাচক রিটার্ন মূল্যায়নের জন্য ব্যবহৃত হয়। এক 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
আপনি যদি পড়ার চেষ্টা করেন /dev/null, তবে এটি কোনও EOFও ফেরত দেওয়া উচিত, তাই না? বা আমি সেখানে কি পেতে পারি?
বাইট কমান্ডার

@ বাইটকম্যান্ডার এটি খুঁজে বের করতে দেয়। বিড়াল / দেব / নাল করুন | বিড়াল -A।
সের্গেই কলডিয়াজন্য

যোগ অধ্যায় @ByteCommander আপনার মন্তব্যকে অ্যাড্রেসিং
Sergiy Kolodyazhnyy

2

ইওএফ বলতে ফাইলের সমাপ্তি বোঝায় । আমি কীভাবে নীচের চিহ্নটিকে ট্রিগার করব জানি না, আপনি কোনও ফাইলের পাইপিংয়ের মাধ্যমে নিম্নলিখিত প্রোগ্রামটি চালাতে পারেন, যা শেষে EOF সিগন্যাল প্রেরণ করে :

echo "Some sample text" | ./a.out

a.outআপনার সংকলিত উত্স কোথায়


1
এটি ইতিমধ্যে উত্সাহিত করা হয়েছে, তবে সাইড নোটে ইওএফ কোনও চরিত্র নয়, আমি মনে করি ভুল ধারণাটি সিটিআরএল কী-স্ট্রোকের মাধ্যমে সিগন্যাল হওয়া সত্য থেকে উদ্ভূত হয়েছিল, যা সাধারণত প্রিন্টযোগ্য অক্ষরগুলি ইনপুট করার উপায়। আমি যে সব আসলে ঘটবে বুঝতে হিসাবে যে সমস্ত ইনপুট রাঙা হয় এবং ইনপুট হচ্ছে রাঙা খালি হতে read()(প্রাপ্ত syscall) ফিরে আসবে 0, যা ফাইলের শেষে হিসেবে ব্যাখ্যা করা হয়: stackoverflow.com/a/1516177/4316166
কস

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