كيف يمكنني معرفة ما تبطن مورد الملف هو حاليا "على" في PHP؟

StackOverflow https://stackoverflow.com/questions/1352598

  •  20-09-2019
  •  | 
  •  

سؤال

وعن طريق PHP، فمن الممكن لقراءة قبالة محتويات ملف باستخدام fopen وfgets. كل مرة يتم استدعاء fgets، فإنه يعود السطر التالي في الملف.

وكيف fgets <م> معرفة ما سطر لقراءة؟ وبعبارة أخرى، كيف نعرف أنه الماضي خط قراءة 5، لذلك يجب أن تعود محتويات خط 6 هذه المرة؟ هل هناك طريقة بالنسبة لي للوصول إلى تلك البيانات خط العدد؟

(وأنا أعلم أنه من الممكن أن تفعل شيئا من هذا القبيل من خلال قراءة محتويات الملف في صفيف مع file، ولكن أود أن إنجاز هذا مع fopen).

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

المحلول

وهناك "موقف" أبقى في الذاكرة لكل ملف الذي يتم فتحه. فإنه يتم تحديثه تلقائيا في كل مرة كنت تقرأ خط / شخصية / أيا كان من الملف.

ويمكنك الحصول على هذا المنصب مع ftell ، وتعديله مع < وأ href = "http://php.net/manual/en/function.fseek.php" يختلط = "noreferrer نوفولو"> fseek :

<اقتباس فقرة>   

وftell - إرجاع الوضع الحالي   ملف القراءة / الكتابة المؤشر

     

وfseek - يسعى على مؤشر الملف

ويمكنك أيضا استخدام الترجيع ل... بحبك ... موقف هذا المؤشر.

و
هذا لا يحصل لك منصب عددا الخط، ولكن أقرب إلى منصب عددا الطابع <م> (في الواقع، كنت تحصل على منصب في عدد من وحدات البايت من بداية الملف) . عندما يكون لديك ذلك، قراءة الخط هو مجرد ميتر قراءة الأحرف حتى يو ضرب حرف نهاية السطر.

و
BTW: بقدر ما أتذكر، هذه الوظائف تأتي من لغة C - PHP نفسها يتم كتابتها في C؛ -)

نصائح أخرى

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

ومجرد تخيل التعامل من سطح السفينة من 52 بطاقة بالتتابع. كنت تسليم قبالة البطاقة الأولى. في المرة القادمة بطاقة 2.. عندما تريد أن نعطيه بطاقة 3.، لا تحتاج إلى بدء العد من البداية مرة أخرى، أو حتى تذكر أين كنت أنت فقط تسليم البطاقة متوفرة القادمة، والتي سوف يكون ثالث.

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

وPHP ولا OS لا يوجد لديه حاجة حقيقية للحفاظ على رقم السطر حولها، لأن كل الرعاية النظام عنه هو "السطر التالي". إذا كنت تريد أن تعرف رقم السطر، عليك أن تبقي على العداد وزيادة في كل مرة التطبيق يقرأ الخط.

$lineno=0;
while (!feof($handle)) {
    $buffer = fgets($handle, 4096);
    lineno++; // keep track of the line number
     ...

}

وط هف هذه العينة القديمة ط الحب مساعدة يمكن لها لك:)

$File = file('path');
$array = array();

$linenr = 5;

foreach( $File AS $line_num => $line )
{
$array = array_push( $array , $line );
}

echo $array[($linenr-1)];

هل يمكن أن مجرد دعوة fgets وفسيزيد على $line_number فار في كل مرة كنت اسميها. ومن شأن ذلك أن أقول لك خط كان على.

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