سؤال
كيف يمكنك رؤية آخر طباعة؟ وبعبارة أخرى ما الذي يجب وضعه في 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 حتى النهاية عند كتابة ملف نصي. لقد حدث هذا بسبب شيئين:
التوافق المتخلف مع CP/M. سجل نظام ملفات CP/M فقط أطوال الملفات في مضاعفات "السجلات" 128 بايت ، لذلك تم استخدام حرف تحكم-Z للاتفاقية لتمييز نهاية البيانات ذات معنى إذا انتهت في منتصف السجل. قام نظام ملفات MS-DOS دائمًا بتسجيل طول الملفات الدقيقة للبايت ، لذلك لم يكن هذا ضروريًا أبدًا على MS-DOS.
يسمح للبرامج باستخدام نفس الرمز لقراءة الإدخال من كل من الطرفية والملف النصي.
#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);
}