الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

Fseek مع Seek_end لكن ال Pos يرجع 0

بدأه Xacker في 15 نوفمبر 2008 · 5 رد · 840 مشاهدة · في لغة C و ++C
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

أحاول استخدام fseek في MSVS 6 لكن باستخدامه الـ file pointer لا يبدو أنه يتغير

#include <stdio.h>

FILE *stream;

void main( void )
{
   long position;
   if( (stream = fopen( "ftell.c", "ab" )) != NULL )
   {
	  position = ftell( stream );
	  printf( "%x\n", position );
	  fseek(stream, 0L, SEEK_END);
	  position = ftell( stream );
	  printf( "%x\n", position );
	  fclose( stream );
   }
}

في الحالتين يكون الخرج 0 والمطلوب هو وضع المؤشر في نهاية الملف. (ملاحظة: "ab" حتماً لا يمكن استخدام سواها)

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#2

النتائج 0 و 0 هذا في حالة الملف لم يكن موجود عندها الملف الجديد الذي حجمه 0 بايت الذي سيتم انشاءه نظرا لاستخدام ab mode, سيعطي نتائج 0 و0 لـ Pos

جرب الكتابة بالملف واعادة تنفيذ البرنامج , ستجد النتائج مغايرة

llback.jpg

اشهد ان لا إله إلا الله وان محمدا ً رسول الله

#3

يا time1 وضعت ملف من عندي وحجمه حوالي 35 كيلو قبل أن أكتب الموضوع والنتائج التي أتكلم عنها والملف موجود.

عند تشغيله من cmd يظهر 0 للنتيجتين، أضفت system("pause") فظهرت النتيجة صحيحة بتشغيله مباشرة.

سؤال آخر متعلق بالموضوع،

استخدمت fseek وجعلت المؤشر في نهاية الملف.

ثم استخدمت ftell وحصلت على الإزاحة

انقصت من الإزاحة 7 بايتات ثم استخدمت fseek مرة أخرى وجعلت المؤشر من بداية الملف بقيمة الإزاحة الجديدة.

الآن لو استخدمت fprintf ثم fflush للكتابة فيه هل يتم الكتابة فوق آخر 7 بايتات منه؟

تم تعديل هذه المشاركة بواسطة Xacker في 16 نوفمبر 2008 في 00:10

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#4

أخي Xacker البرنامج يعمل في gcc والنتيجه صحيحه ..

بالنسبه لمعامل a ، فالكتابه دائما تكون في النهايه ، حتى لو غيرت الموقع ، عندما تكتب سوف يكتب من النهايه .. يعني لا يمكن عمل Overwrite بهذه الطريقه ،، لكن وأردت أن تقوم بالاضافه في البدايه فيمكن ذلك ، استخدم wa وقم بنسخ محتويات الملف لملف أخر ، وتضيف البيانات الجديده في البدايه ، بعدها ترجع تلك البيانات من الملف .. هذا لأضافه في البدايه ، لكن في مثل حالتك لا أعلم ..

بالتوفيق ،

http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة

https://moalfat.com  للكتب الالكترونية والكورسات التعليمية

Everything we see now is just an engineering solution based on old science

#5

اهلا Xacker , بالنسبة للبرنامج الذي سالتني عنه , هل تقصد بهذا الشكل ؟

   long position;
   int n;
   if( (stream = fopen( "ftell.c", "r+" )) == NULL )
	   printf("Error");
   else
   {

	   scanf("%d",&n);
	  position = ftell( stream );
	  printf( "%x\n", position );
	  fseek(stream, n, SEEK_SET);
	  fprintf(stream,"%s","test");

	  position = ftell( stream );
	  printf( "%x\n", position );
	  fclose( stream );



   }
llback.jpg

اشهد ان لا إله إلا الله وان محمدا ً رسول الله

#6

يعني باستخدام "ab" مافي مجال أبداً.. فإذاً أنا مضطر غير المعامل :)

شكراً شباب

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…