سؤال

كيف يمكنك رؤية آخر طباعة؟ وبعبارة أخرى ما الذي يجب وضعه في EOF؟ راجعت التعاريف وتقول EOF هي -1.

وإذا أدخلت Ctrl-D ، فلن ترى أي شيء.

#include <stdio.h>

int main() {
 int c;
 while((c = getchar() != EOF)) {
  printf("%d\n", c);
 }
 printf("%d - at EOF\n", c);
}
هل كانت مفيدة؟

المحلول

على أنظمة Linux و OS X ، يتم إدخال الحرف للتسبب في EOF كنترول-د. لنظام التشغيل Windows ، إنه كنترول-ض.

اعتمادًا على نظام التشغيل ، لن تعمل هذه الشخصية إلا إذا كانت الشخصية الأولى على السطر ، أي الشخصية الأولى بعد يدخل. نظرًا لأن إدخال وحدة التحكم غالبًا ما يكون موجهًا نحو الخط ، فقد لا يتعرف النظام أيضًا على حرف EOF حتى بعد متابعته مع يدخل.

ونعم ، إذا تم التعرف على هذه الشخصية على أنها EOF ، فلن يرى برنامجك الشخصية الفعلية أبدًا. بدلاً من ذلك ، سيحصل برنامج C -1 من عند getchar().

نصائح أخرى

يجب عليك تغيير قوسينك إلى

while((c = getchar()) != EOF)

لأن المشغل "=" له أسبقية أقل من المشغل "! =". ثم ستحصل على النتائج المتوقعة. تعبيرك يساوي

while (c = (getchar()!= EOF))

أنت تحصل على اثنين من الإخراج ، لأنك تقوم بالمقارنة "C! = EOF". سيصبح هذا دائمًا للشخصية التي أدخلتها ، ثم " n" التي تتبعها العودة. باستثناء المقارنة الأخيرة حيث C هو حقًا ، فإنه سيعطيك 0.

تحرير حول EOF: EOF عادة ما يكون -1 ، ولكن هذا غير مضمون وفقًا للمعيار. يحدد المعيار فقط عن EOF في القسم 7.19.1:

EOF الذي يتوسع إلى تعبير ثابت ثابت ، مع النوع int وقيمة سالبة ، يتم إرجاعها بواسطة عدة وظائف للإشارة إلى نهاية الملف ، أي لم يعد مدخلات من دفق ؛

من المعقول افتراض أن EOF يساوي -1 ، ولكن عند استخدام EOF ، يجب ألا تختبر مقابل القيمة المحددة ، بل تستخدم الماكرو.

قيمة EOF هي عدد صحيح سلبي لتمييزه عن القيم "char" الموجودة في النطاق من 0 إلى 255. عادة ما يكون -1 ، ولكن يمكن أن يكون أي رقم سالب آخر ... وفقًا لمواصفات POSIX ، لذلك أنت لا ينبغي أن تفترض أنها -1.

حرف ^D هو ما تكتبه في دفق وحدة التحكم على UNIX/Linux لإخباره بإنهاء دفق إدخال منطقيًا. ولكن في سياقات أخرى (مثل عندما تقرأ من ملف) ، فهي مجرد حرف بيانات آخر. في كلتا الحالتين ، لا تجعل حرف ^D (معنى نهاية الإدخال) أبدًا رمز التطبيق.

كما يقول Bastien ، يتم إرجاع EOF أيضًا إذا getchar() فشل. بالمعنى الدقيق للكلمة ، يجب عليك الاتصال ferror أو feof لمعرفة ما إذا كان EOF يمثل خطأ أو نهاية للتيار. ولكن في معظم الحالات ، سيفعل طلبك نفس الشيء في كلتا الحالتين.

eof يعني نهاية الملف. إنها علامة على أنه تم الوصول إلى نهاية ملف ، وأنه لن يكون هناك بيانات بعد الآن.

تعديل:

أنا أقف بشكل صحيح. في هذه الحالة ، ليست نهاية الملف. كما ذكرنا ، يتم تمريره عند تمرير Ctrl+D (Linux) أو Ctrl+z (Windows).

زوجان من الأخطاء المطبعية:

while((c = getchar())!= EOF)

بدلاً من:

while((c = getchar() != EOF))

يعامل GetChar () أيضًا مفتاح الإرجاع كمدخل صالح ، لذلك تحتاج إلى تخزينه أيضًا. Eof هو علامة للإشارة إلى نهاية الإدخال. عموما هو int مع جميع البتات مجموعة.


#include <stdio.h>
int main()
{
 int c;
 while((c = getchar())!= EOF)
 {
  if( getchar() == EOF )
    break;
  printf(" %d\n", c);
 }
  printf("%d %u %x- at EOF\n", c , c, c);
}

مطبوعات:

49
50
-1 4294967295 ffffffff- at EOF

للمدخلات:

1
2
<ctrl-d>

NPUT من محطة واحدة لا "تنتهي" أبدًا (ما لم يتم فصل الجهاز) ، ولكن من المفيد إدخال أكثر من "ملف" في محطة ، وبالتالي يتم حجز تسلسل المفاتيح للإشارة إلى نهاية الإدخال. في UNIX ، يتم تنفيذ ترجمة ضغط المفاتيح إلى EOF بواسطة برنامج التشغيل الطرفي ، لذلك لا يحتاج البرنامج إلى تمييز المحطات عن ملفات الإدخال الأخرى. بشكل افتراضي ، يقوم برنامج التشغيل بتحويل حرف التحكم-D في بداية السطر إلى مؤشر نهاية الملف. لإدراج حرف تحكم فعلي D (ASCII 04) في دفق الإدخال ، يسبقه المستخدم مع حرف أمر "اقتباس" (عادةً Control-V). Amigados متشابه ولكنه يستخدم Control- بدلاً من Control-D.

في Microsoft's DOS و Windows (وفي CP/M والعديد من أنظمة التشغيل DEC) ، لن تنتج القراءة من المحطة EOF أبدًا. بدلاً من ذلك ، تدرك البرامج أن المصدر هو محطة (أو "جهاز شخصية" آخر) وتفسير حرفًا أو تسلسلًا محجوزًا معينًا كمؤشر نهاية الملف ؛ الأكثر شيوعًا هذا هو Control-Z Control-Z ، رمز 26. بعض برامج MS-DOS ، بما في ذلك أجزاء من Microsoft MS-DOS Shell (Command.com) وبرامج الأدوات المساعدة للنظام التشغيل (مثل Edlin) ، علاج Control-Z في ملف نصي يحدد نهاية البيانات ذات المغزى ، و/أو إلحاق عنصر تحكم-Z حتى النهاية عند كتابة ملف نصي. لقد حدث هذا بسبب شيئين:

  1. التوافق المتخلف مع CP/M. سجل نظام ملفات CP/M فقط أطوال الملفات في مضاعفات "السجلات" 128 بايت ، لذلك تم استخدام حرف تحكم-Z للاتفاقية لتمييز نهاية البيانات ذات معنى إذا انتهت في منتصف السجل. قام نظام ملفات MS-DOS دائمًا بتسجيل طول الملفات الدقيقة للبايت ، لذلك لم يكن هذا ضروريًا أبدًا على MS-DOS.

  2. يسمح للبرامج باستخدام نفس الرمز لقراءة الإدخال من كل من الطرفية والملف النصي.

#include <stdio.h>

int main() {
    int c;
    while((c = getchar()) != EOF) { //precedence of != is greater than =, so use braces
        printf("%d\n", c);
    }
    printf("%d - at EOF\n", c);
}

أعتقد أن هذه الطريقة الصحيحة للتحقق من قيمة EOF. وفحصت الإخراج.

للمدخلات: ABC وأدخل حصلت على الإخراج: 97 98 99 10. (قيم ASCII)

للإدخال CTRL -D حصلت على الإخراج: -1 -في EOF. لذلك أعتقد أن -1 هي قيمة EOF.

جرب مدخلات أخرى بدلاً من Ctrl-D ، مثل Ctrl-Z. أعتقد أنه يختلف من برنامج التحويل البرمجي إلى المترجم.

للحفاظ على الأمر بسيطًا: EOF هو نوع عدد صحيح مع القيمة -1. لذلك ، يجب أن نستخدم متغير عدد صحيح لاختبار EOF.

#include <stdio.h>

int main() {
    int c;
    while((c = getchar()) != EOF) { 
        putchar(c);
    }    
    printf("%d  at EOF\n", c);
}

تم تعديل الكود أعلاه لإعطاء مزيد من الوضوح على EOF ، واضغط على Ctrl+D ويتم استخدام Putchar لطباعة char تجنب استخدام printf داخل أثناء الحلقة.

int c;

while((c = getchar())!= 10)
{
    if( getchar() == EOF )
        break;

     printf(" %d\n", c);
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top