• 0
daziplqa

سؤال حول إستخدام fgets

سؤال

السلام عليكم...

لي سؤال حول إستخدام الدالة fgets ...

fgets(buff, buff_len, fp);

السؤال هو, ماذا لو كان ال buff_len أقل من طول السطر المراد قراءته؟

حسب موقع cplusplus فإنه سيتم القراءه حتي الوصول إلى buff_len أو نهاية السطر أيهما أقرب.... إذن إذا كان السطر أطول من ال buff_len فلن يتم قراءة باقي السطر, لكني وجدت أنه يتم قراءة السطر كاملة حتى لو كان أطول من ال buff_len , إذن فما المغزى؟

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

3 إجابة على هذا السؤال .

  • 0

شكرا أخ خالد,,, حقيقة معك حق wink.gif, فقد قمت بتجربتها على كل من VC++ و GCC و عملت بدقة...

لكن لي تساؤل أخر هو كان سبب اللبس الذي كان لدي.

لو أن معي هذا الكود:


#include <stdio.h>

int main ()
{
FILE * pFile;
char buff[20];
pFile = fopen ("file.txt","r");

if (pFile==NULL) perror ("Error opening file");
else
{
while (!feof(pFile))
{
//buff[0] = '\0';
fgets(buff, 20, pFile);
printf("%s", buff);
}
fclose (pFile);
}
return 0;
}

و أردت أن أقرأ هذه الملف:


ABCDEFGHIJKLMNOPQRSTUVWXYZ

لاحظ إنتهاء الملف بسطر جديد.. ,

فإن الكود بالأعلى سوف يطبع:


ABCDEFGHIJKLMNOPQRSTUVWXYZ
TUVWXYZ

و هذا بسبب السطر الجديد ...

حيث في أول لفه داخل ال while تم قراءة أول 19 حرف , ثم داخل ثاني لفة تم قراءة باقي الأحرف من السطر الأول, و لكننا لم نصل لنهاية الملف حتى الأن بسبب أن لدينا سطر جديد... أما داخل ثالث لفه,, فقط وصلنا لنهاية الملف (1-) لكن ال buff مازال يحمل القيمة المسنده إليه من ثاني لفه, ألا وهي باقي الأحرف الأبجديه , و بالتالي قام بطباعتها... , لتفادي ذلك, قمت بتصفير ال buff بجعله يحمل null string,, هل هذا حل مناسب؟؟ و هل من حلول أخرى؟؟

هنا الكود كامل:

http://m-hewedy.blogspot.com/2010/08/wc-very-simple-word-count-c-program.html

(أتسلى و أتعلم بنفس الوقت smile.gif)

شكرا لك

تم تعديل بواسطه هويدي
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

متى أصبح لديك blog :cool:

الطريقة التي أتبعتها هي كالتالي:


#include <stdio.h>

int main ()
{
FILE * pFile;
char buff[20];
pFile = fopen ("file.txt","r");

if (pFile==NULL) perror ("Error opening file");
else
{
/* fgets returns NULL if it is the end-of-file
or if there is an error. Otherwise, it returns
a pointer to the passed string. */
while ( fgets(buff, 20, pFile) )
printf("%s", buff);
/* Here you can check if it is the end-of-file,
or if there is an error. */
fclose (pFile);
}
return 0;
}

الطريقة ببساطة أن تتحقق من القيمة العائدة من fgets فإن كانت NULL فإنه ليس هناك شيء لقرائته إما لحدوث خطأ أو انتهاء البيانات في الملف, أما إن لم تكن كذلك فإن العائد من fgets هو نفس المؤشر buff. طبعاً إعادة buff للتسهيل لا أكثر إن كنت ستقوم باستخدام العائد من fgets مباشرة. هناك ملاحظة بسيطة مربكة في الحقيقة, و هي كيفية عمل الـ end-of-line. عندما يكون هناك بيانات, و تم وضعها في buff و من ثم وجدنا end-of-line فلن يتم إعادة NULL مباشرة, و إنما سيتم عمل set للـ end-of-line في الـ stream نفسه و في هذه الحالة عبارة عن ملف يسمى pFile. الآن, عندما تريد أي دالة قراءة pFile فإنها تتحقق من eof أولاً, و تعيد NULL على سبيل المثال إذا كان كذلك.

تحياتي...

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

شكرا أخ خالد على الطريقة الجميله...

بالمناسبة, أنا مدون قدييييييم,,, من بدايات 2007 تقريبا .. :D

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .