الكتابة إلى ملف باستخدام النواتج في C




string file (2)

هل يمكن لأحد أن يقول لي لماذا لا يتغير الملف؟ وهو يعمل عند استخدام rewind أو fseek ولكن ليس على خلاف ذلك.

ما هي الطريقة القياسية لاستخدام fgets بعد fgets . مؤشر الملف في الموضع 9 لذا يجب على fputs الكتابة بعد ذلك، لكنها لا تفعل أي شيء.

في الملف:

abcd efgh ijkl mnor

في شفرة المصدر:

char c;
char str[15];

FILE *fp = fopen("d:\\data.txt","r+");

fgets(str, 10, fp);

// fseek(fp, 9, SEEK_SET);
// rewind(fp);

printf("%d\n", ftell(fp));
// ftel shows that it's in "9".

printf("%s", str);

fputs(str, fp);
// why its not working

fclose(fp);

وفيما يتعلق بتعريف fopen/'+' في المعيار C (مثلما هو الحال في مشروع المعيار C هذا على الإنترنت )، فإن التحول من القراءة إلى الكتابة يتطلب استدعاء وسيطا لوظيفة تحديد الملفات (التركيز على الألغام):

7.21.5.3 وظيفة فوبين

(7) عند فتح ملف مع وضع التحديث ('+' كحرف الثاني أو الثالث في قائمة الوسيطة القيم الوسيطة أعلاه)، قد يتم تنفيذ الإدخال والإخراج على دفق المرتبطة. ومع ذلك، لا يمكن أن يتبع الإخراج مباشرة بواسطة مدخلات دون نداء تدخل إلى وظيفة ففلوش أو إلى وظيفة تحديد ملف (فسيك، فسيتبوس، أو الترجيع) ، ويجب أن لا يتبع مباشرة المدخلات من دون إجراء مكالمة تداخل إلى ملف تحديد المواقع ، ما لم تواجه عملية الإدخال نهاية الملف. فتح (أو إنشاء) ملف نصي مع وضع التحديث قد بدلا من فتح (أو إنشاء) تيار ثنائي في بعض التطبيقات.

لذلك أقترح عليك كتابة الشفرة التالية للتغلب على مشكلتك:

fseek ( fp , 0, SEEK_CUR);
fputs(str, fp);

وثائق مس ل fopen يقول هذا:

عندما يتم تحديد نوع الوصول "r+" أو "w+" أو "a+" ، يتم تمكين كل من القراءة والكتابة (يقال إن الملف مفتوح ل "أوبديت"). ومع ذلك، عند التبديل من القراءة إلى الكتابة، يجب أن تواجه عملية الإدخال علامة EOF . إذا لم يكن هناك EOF ، يجب عليك استخدام مكالمة التدخل إلى وظيفة تحديد المواقع ملف. وظائف تحديد الملفات ملف fsetpos ، fseek ، rewind . عند التبديل من الكتابة إلى القراءة، يجب عليك استخدام مكالمة تدخل إلى إما fflush أو إلى وظيفة تحديد المواقع ملف.





file