سؤال

لدي مؤشر ملف أستخدمه مع FGETS () لإعطائي خطًا كاملاً مع الخط الجديد في المخزن المؤقت. أريد استبدال 1 Char وإضافة حرف آخر قبل الخط الجديد. هل هذا ممكن؟ فمثلا:

buffer is "12345;\n"
output buffer is "12345xy\n"

هذا هو الرمز:

buff = fgets((char *)newbuff, IO_BufferSize , IO_handle[i_inx]->fp);
nptr = IO_handle[i_inx]->fp;
if(feof(nptr))
    {
            memcpy((char *)o_rec_buf+(strlen((char *)newbuff)-1),"E",1);
    }
    else
    {
            memcpy((char *)o_rec_buf+(strlen((char *)newbuff)-1),"R",1);
    }

كما ترون ، فأنا أستبدل الخط الجديد هنا (يظهر سطر المثال أعلاه). أريد إدراج النص والاحتفاظ بالخط الجديد بدلاً من ما أفعله أعلاه.

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

المحلول

لا يمكنك إدخال حرف واحد بالطريقة التي تريدها. إذا كنت متأكدا o_rec_buf لديه مساحة كافية ، وسينتهي الخط دائمًا ";\n", ، ثم يمكنك أن تفعل شيئًا مثل:

size_t n = strlen(newbuff);
if (n >= 2)
    strcpy(o_rec_buf + n - 1, "E\n");
    /* memcpy(o_rec_buf+n-1, "E\n", 3); works too */

لاحظ ذلك باستخدام feof() مثل الطريقة التي تفعله هو خطأ في معظم الأحيان. feof() يخبرك إذا ضربت حالة نهاية الملف على ملف بعد، بعدما لقد ضربته. إذا كنت تقوم بتشغيل الرمز أعلاه في حلقة ، متى feof() إرجاع "صحيح" ، لن تتم قراءة أي خط بواسطة fgets, ، و buff سوف يكون NULL, ، لكن newbuff لن يتغير. بعبارات أخرى، newbuff سوف تحتوي على بيانات من الأخير fgets مكالمة. ستقوم بمعالجة السطر الأخير مرتين. نرى CLC الأسئلة الشائعة 12.2 للمزيد ، وحل.

وأخيرا ، لماذا كل القوالب؟ نكون o_rec_buf و newbuff ليس من النوع char *?

نصائح أخرى

إذا كان لدى المخزن المؤقت مساحة كافية ، فستحتاج إلى نقل حرف Trailer 1 بشكل أكبر ، باستخدام Memmove وتحديث Char الذي تحتاجه. تأكد من أنك لا تنسى أن تتخلى عن " 0".

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