PDA

View Full Version : مشکل با ftell



ali ali10
جمعه 10 مهر 1394, 20:15 عصر
با سلام
من با استفاده از دستور زیر فایلی را خوانده و سپس مقدار اشاره گر را نیز می خوانم

long position=1000;
unsigned char ch[100];

fseek (stream,0,SEEK_SET);
int kk=fread(&ch,sizeof(ch),1,stream);
position=ftell(stream);

پس از اجرای دستور ftell و نمایش مقدار position انتظار می رود مقدار آن برابر با 100 باشد ولی با کمال تعجب مقدار آن برابر 3465 خواهد بود!!!!!!!!!!!
حال با ورود دستورات زیر:

long position1=1000,position2=1000;
unsigned char ch[100];

fseek (stream,0,SEEK_SET);
int kk=fread(&ch,sizeof(ch),1,stream);
position1=ftell(stream);

fseek (stream,0,SEEK_SET);
fread(&ch,sizeof(ch),1,stream);
position2=ftell(stream);

printf("%ld %ld\n",position1,position2);

با نمایش دو مقدار position1 , position2 مقدار position1 برابر همان 3465 بوده ولی position2برابر 100 خواهد شد جالب تر آنکه مقادیری که در هر دو حالت در ch قرار می گیرد مثل هم است.
چرا؟؟؟یعنی برای آنکه ftell مقدار صحیح را برگرداند باید تابع fread را یکبار اجرا کرده و سپس با fseek اشاره گر را صفر کرد و آنگاه دوباره فایل را از اول خواند تا تابع ftell مقدار صحیح را برگرداند؟؟؟
این که خیلی غیر منطقی به نظر می آید!!!!!!

pbm_soy
شنبه 11 مهر 1394, 00:08 صبح
بهتر میشد اگه کد را کامل اینجا میگذاشتید و یا حداقل دستور باز کردن فایل را میگذاشتید ولی در کل تابع ftell وقتی بروی فایلی که بصورت باینری باز شده است فراخوانی شود محل جاری اشاره گر فایل را برمیگرداند ولی اگر فایل بصورت متنی باز شده باشد مقداری که برمیگرداند شاید برای ما معنی نداشته باشد ولی در آینده میتوان آنرا به fseek داد تا اشاره گر فایل را به آن محل انتقال دهد!

pbm_soy
شنبه 11 مهر 1394, 00:19 صبح
برای اطلاعات بیشتر میتوانید به لینک زیر مراجعه کنید
https://www.securecoding.cert.org/confluence/display/c/FIO19-C.+Do+not+use+fseek()+and+ftell()+to+compute+the+s ize+of+a+regular+file

اگر سرچ کنید راهنما و نکات زیاد دیگری نیز میتوانید پیدا کنید این لینک این خصوصیت تابع ftell را از لحاظ امنیتی بررسی میکند