سؤال

معظم اللغات مثل C ++ عند الكتابة في ملف ، ضع حرف EOF حتى لو فاتنا لكتابة عبارات مثل:

filestream.close

ومع ذلك ، هناك أي طريقة ، يمكننا وضع حرف EOF وفقًا لمتطلباتنا ، في C ++ ، لمثيل. أو أي طريقة أخرى قد نستخدمها بصرف النظر عن استخدام الوظائف المتوفرة في C ++.

إذا كنت بحاجة إلى طلب المزيد من المعلومات ، فالتوصل إلى تعليق.

شكرا مقدما.

تحرير: شكرًا لدعمكم ولكن إليك إضافة إلى هذا السؤال:

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

أنا آسف إذا كنت مخطئًا في أي وقت في تقديري ، لكن الرجاء مساعدتي في ذلك ، فقد يؤدي ذلك إلى الكثير من الأفكار الجديدة.

هل كانت مفيدة؟

المحلول

لا يوجد شخصية EOF. EOF بحكم التعريف "غير متكافئ لأي رمز حرف صالح". غالبًا ما يكون -1. لا يتم كتابته في الملف في أي وقت.

هناك قيمة حرف EOF تاريخية (CTRL+Z) في DOS ، لكنها عفا عليها الزمن هذه الأيام.

للإجابة على سؤال متابعة Apoorv: لا يستخدم نظام التشغيل أبدًا بيانات الملف لتحديد طول الملف (لا يتم إنهاء الملفات "بأي شكل من الأشكال). لذلك لا يمكنك خداع نظام التشغيل. ربما لن تقرأ البرامج القديمة الغبية بعد شخصية CTRL+Z. لن أفترض أن أي تطبيق Windows (حتى المفكرة) سيفعل ذلك. أظن أنه سيكون من الأسهل خداعهم مع فارغة (\0) حرف.

نصائح أخرى

نحن سوف، EOF هي مجرد قيمة يتم إرجاعها بواسطة الوظيفة المحددة في C. stdio.h الملف الاساسي. عاد بالفعل إلى جميع وظائف القراءة من قبل نظام التشغيل ، لذلك يعتمد النظام. عندما يصل نظام التشغيل إلى نهاية الملف ، فإنه يرسله إلى الوظيفة ، والتي في قيمة إرجاعها أكثر من الأماكن الأكثر شيوعًا (-1)، لكن ليس دائما. لذلك ، لتلخيص ، EOF ليس شخصية ، ولكن ثابت عاد من قبل نظام التشغيل. تحرير: حسنًا ، تحتاج إلى معرفة المزيد عن نظام الملفات ، انظر إلى هذه.

مرحبًا ، لسؤالك الثاني:

مرة أخرى ، يجب أن تبدو أفضل في filesystems. الدهون مثال رائع للغاية ، لأنه يمكنك العثور على العديد من المقالات حول هذا الموضوع ، ومبادئها مماثلة للغاية مع NTFs. على أي حال ، مرة أخرى ، eof هو NOT a character. لا يمكنك وضعه في الملف مباشرة. إذا تمكنت من القيام بذلك ، تخيل العواقب ، حتى لا يمكن قراءة ملف الصورة "الغبي".

لماذا ا؟ Becouse OS يعمل مثل بنية معقدة للغاية للطبقات. واحدة من الطبقة هو برنامج تشغيل نظام الملفات. يتأكد من أنه ينقل البيانات من كل نظام ملفات معروف للسائق. يوفر الجسر بين التطبيقات ونظام Actuall لتخزين الملفات في HDD.

على وجه الدقة ، يستخدم نظام الملفات الدهون ما يسمى الجدول الدهون - إنه جدول يقع بالقرب من بداية مساحة ADRESS HDD (أو القسم) ، ويحتوي على خريطة لجميع المجموعات (خلايا تخزين صغيرة). حسنًا ، حتى الآن ، عندما تريد حفظ بعض الملفات إلى HDD ، ينظر OS (برنامج تشغيل نظام الملفات) في جدول FAT ، ويبحث عن القيمة "0x0". تقول قيمة "0x0" لنظام التشغيل أن الكتلة التي يتم وصفها من خلال موقع هذه القيمة في جدول الدهون مجاني في الكتابة.

لذلك يكتب فيها الجزء الأول من الملف. بدلاً من ذلك ، فإنه يبحث عن قيمة "0x0" أخرى في الدهون ، وإذا وجدت ، فإنه يكتب الجزء الثاني من الملف إلى مجموعة يشير إليه. من أن يغير قيمة سجل الجدول الدهني الأول حيث يوجد الملف إلى العدو الفعلي للآخر في الجزء الثاني من الملف.

عندما يتم تخزين ملفك جميعًا على محرك الأقراص الصلبة ، يأتي الآن الجزء الأخير ، فهو يكتب قيمة EOF المطلوبة ، ولكن في جدول الدهون ، وليس في "جزء البيانات" من HDD. لذلك عندما تتم قراءة الملف في المرة القادمة ، فإنه يعلم أن هذه هي النهاية ، لا تبدو أكثر من ذلك.

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

جئت إلى هنا أثناء مرور كيرنغان وريتشي ج تمارين.

كنترول+د يرسل الشخصية التي تطابق EOF ثابت من stdio.h.

(تحرير: هذا على Mac OS X ؛ بفضل markmnl للإشارة إلى أن ما يعادله Windows 10 كنترول+ض)

في الواقع في C ++ ، لا يوجد حرف EOF فعليًا مكتوبة إلى ملف باستخدام إما آليات FPRINTF () أو Ostream. EOF هي حالة I/O للإشارة إلى عدم وجود المزيد من البيانات للقراءة.

استخدمت بعض أنظمة تشغيل القرص المبكرة مثل CP/M فعليًا 0x1a (ASCII Sub Party) للإشارة إلى EOF لأن نظام الملفات لم يحتفظ إلا بحجم الملف في الكتل ، لذا لم تعرف أبدًا المدة التي يستغرقها الملف بالبايت. مع ظهور تخزين تعداد الطول الفعلي في الدليل ، لم يعد من المعتاد تخزين حرف "EOF" كجزء من بيانات ملف "in-band".

تحت Windows ، إذا واجهت ASCII 26 (EOF) في Stdin ، فسيتوقف عن قراءة بقية البيانات. أعتقد أن كتابة هذه الشخصية ستنهي أيضًا الإخراج المرسلة إلى stdout ، لكنني لم أكن أؤكد ذلك. يمكنك تبديل الدفق إلى الوضع الثنائي كما في هذا السؤال:

#include <io.h>
#include <fcntl.h>
...
_setmode(0, _O_BINARY)

ولن تتوقف عن تحويل 0x0a إلى 0x0d 0x0a فحسب ، بل ستحصل أيضًا على القدرة على قراءة/كتابة 0x1a أيضًا. لاحظ أنه قد تضطر إلى تبديل كل من stdin (0) و stdout (1).

إذا كان من خلال حرف EOF يعني شيئًا مثل Control-Z ، فإن أنظمة التشغيل الحديثة لا تحتاج إلى شيء من هذا القبيل ، ولن يكتب C ++ وقت تشغيله لك. يمكنك بالطبع كتابة واحدة بنفسك:

 filestream.put( 26 );     // write Ctrl-Z

ولكن لا يوجد سبب وجيه للقيام بذلك. ليست هناك حاجة للقيام:

 filesystem.close();

نظرًا لأن دفق الملفات سيتم إغلاقه لك تلقائيًا عندما يتم استدعاء المدمر ، ولكن من الممارسات الجيدة (على ما أظن) القيام بذلك.

لا يوجد شيء مثل شخصية "EOF". حقيقة إغلاق الدفق في حد ذاته هي حالة "EOF".

عندما تضغط كنترول+د في قذيفة UNIX ، يغلق هذا ببساطة دفق الإدخال القياسي ، والذي بدوره يتم التعرف عليه بواسطة shell على أنه "EOF" ويخرج.

لذلك ، "لإرسال" "EOF" ، فقط أغلق الدفق الذي يجب إرساله "EOF".

لم يذكر أحد بعد [f]truncate مكالمات النظام ، وهي كيفية جعل ملف أقصر دون إعادة إنشاءه من نقطة الصفر.

ال truncate() و ftruncate() الوظائف تسبب الملف العادي المسمى بواسطة path أو المشار إليها من قبل fd أن يتم اقتطاعها بحجم بدقة length بايت.

إذا كان الملف سابقًا أكبر من هذا الحجم ، يتم فقدان البيانات الإضافية. إذا كان الملف سابقًا أقصر ، فسيتم تمديده ، ويقرأ الجزء الممتد كبايتات خالية ('\0').

نفهم أن هذه عملية مميزة من كتابة أي نوع من البيانات إلى الملف. الملف عبارة عن مجموعة خطية من البايتات ، وضعت على القرص بطريقة أو بأخرى ، مع البيانات الوصفية التي تقول كم من الوقت ؛ truncate يغير البيانات الوصفية.

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

نعم ، يمكنك إضافة EOF يدويًا إلى ملف. 1) في Mac Terminan ، قم بإنشاء ملف جديد. touch filename.txt

2) افتح الملف في السادس

vi filename.txt

3) في وضع إدراج (HIT I) ، اكتب Control+V ثم التحكم+D. لا تترك مفتاح التحكم على جهاز Mac.

بدلاً من ذلك ، إذا كنت أرغب في^newletters ، مثل^n^m^o^p ، etc ، يمكنني القيام بـ contorl+v ثم التحكم في+newletter. على سبيل المثال ، للقيام ^O ، اضغط على السيطرة ، ثم اكتب V و O ، ثم اترك التحكم.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top