سؤال
أنا أتساءل كيف يمكنك تنفيذ برنامج مماثل ل tail -f
في C/C++، برنامج يراقب ويعالج الأسطر الجديدة المضافة إلى ملف السجل؟
المحلول
يمكنك استخدام fseek() لمسح حالة eof على الدفق.بشكل أساسي، اقرأ حتى نهاية الملف، ثم نام لفترة، ثم fseek() (دون تغيير موضعك) لمسح eof، ثم قم بالقراءة حتى نهاية الملف مرة أخرى.اغسل، اشطف، كرر.رجل fseek(3) للحصول على التفاصيل.
وهنا ما يبدو في بيرل.إن البحث عن Perl () هو في الأساس غلاف لـ fseek (3)، وبالتالي فإن المنطق هو نفسه:
wembley 0 /home/jj33/swap >#> cat p
my $f = shift;
open(I, "<$f") || die "Couldn't open $f: $!\n";
while (1) {
seek(I, 0, 1);
while (defined(my $l = <I>)) {
print "Got: $l";
}
print "Hit EOF, sleeping\n";
sleep(10);
}
wembley 0 /home/jj33/swap >#> cat tfile
This is
some
text
in
a file
wembley 0 /home/jj33/swap >#> perl p tfile
Got: This is
Got: some
Got: text
Got: in
Got: a file
Hit EOF, sleeping
ثم في جلسة أخرى:
wembley 0 /home/jj33/swap > echo "another line of text" >> tfile
والعودة إلى إخراج البرنامج الأصلي:
Hit EOF, sleeping
Got: another line of text
Hit EOF, sleeping
نصائح أخرى
أعتقد أن ما تبحث عنه هو استدعاء التحديد () في c/c++.لقد وجدت نسخة من صفحة الرجل هنا: http://www.opengroup.org/onlinepubs/007908775/xsh/select.html.يأخذ التحديد واصفات الملف كوسيطات ويخبرك عندما يتغير أحدها ويصبح جاهزًا للقراءة.
البرنامج مفتوح المصدر، لذا يمكنك الرجوع إليه.تساءلت عن نفس الشيء ونظرت إلى الكود منذ فترة، معتقدًا أنه سيكون بسيطًا جدًا، لكنني فوجئت بمدى تعقيده.هناك الكثير من الأمور المزعجة التي يجب أخذها بعين الاعتبار.
يمكنك إما استدعاء البث واسترداده مرة أخرى في تطبيقك، أو نظرًا لأنه مفتوح المصدر، فربما تحاول سحبه إلى التعليمات البرمجية الخاصة بك.
أيضًا، من الممكن في C++ iostream فتح ملف للعرض فقط والقراءة فقط حتى النهاية، أثناء التخزين المؤقت لآخر 10 إلى 20 سطرًا، ثم إخراج ذلك.