هوالحکیم.
سلام.
همانطور که تا کنون فهمیده اید، هر فایلی یک اشاره گر دارد(البته هنگامی که باز می شود) و این اشاره گر مشخص می کند که از کجای فایل اطلاعات خوانده شوند و یا در کجا اطلاعات نوشته شوند. به صورت پیش فرض، این اشاره گر به ابتدای فایل اشاره می کند به همین دلیل وقتی شما فایل را باز می کنید و روی آن می نویسید، در همان مکان های قبلی اطلاعات نوشته می شود. توسط تابع fseek می توانید این اشاره گر را جابجا کنید. این تابع اگر اشتباه نکنم، سه پارامتر می گرفت. ترتیب آنها را از MSDN پیدا کنید. یک پارامتر خود فایل، پارامتر دیگر مکانی که قصد جابجایی از آن قسمت را دارید و پارامتر دیگر مقدار جابجایی است. مثلاً در پارامتر دوم می گویید که می خواهید از ابتدای فایل جابجایی را انجام دهید و در پارامتر اندازه می گویید که از این مکان، اه اندازه 10 کاراکتر جابجا شود که بعد از اجرای این دستور، اشاره گر به دهمین کاراکتر فایل اشاره می کند. مثلاً اگر می خواهید اشاره گر را در انتهای فایل قرار دهید، بگویید که مکان جابجایی انتهای فایل باشد و مقدار جابجایی را صفر تعیین کنید. راه حل دیگر استفاده از "a" به جای "w" است. "a" مخفف کلمه append به معنای اضافه کردن یا concat کردن و یا یه همچین معنی است و باعث می شود که شما فقط بتوانید به انتهای فایل متنی اضافه کنید. دقت کنید که چنانچه فایل را در این حالت باز کنید و حتی اگر توسط تابع fseek اشاره گر فایل را به ابتدای فایل ببرید، باز هم اطلاعات در انتهای فایل درج می شود بنابراین فقط در مواردی که قصد اضافه کردن اطلاعات در انتهای یک فایل را دارید، از این تابع استفاده کنید.
اعلان این تابع را جستم، به صورت زیر است(ms-help://MS.MSDNQTR.v80.en/MS.MSDN.v80/MS.WINCE.v50.en/wceappdev5/html/wce50lrffseek.htm):
int fseek(
FILE* stream,
long offset,
int origin
);
همچنین خروجی آن نیز به صورت زیر است:
If successful, fseek returns 0.
Otherwise, it returns a nonzero value.
On devices incapable of seeking, the return value is undefined.
جهت مشخص کردن نواحی(region) نیز از ثوابت زیر استفاده کنید:
SEEK_CUR : Current position of file pointer
SEEK_END : End of file
SEEK_SET : Beginning of file
همچنین نکته دیگری که دیدم در کد رعایت نکردید، اطمینان از صحت باز شدن فایل می باشد. شاید می دانستید و جهت خلاصه نویسی ذکر نکردید، ولی به هر حال حواستان باشد که چنانچه تابع fopen موفق به باز کردن فایل نشد، اشاره گر NULL بر می گرداند بنابراین بعد از استفاده از fopen بررسی کنید که چنانچه اشاره گر حاصل مثلاً pFile شما برابر NULL است، به کاربر خطا دهید که نمی توانید فایل را باز کنید و یا عملی که خودتان می دانید در نظر بگیرید. من یک جایی نیاز به یک فایل temp داشتم برای همین از تابع tmpname (که در ویژوال استودیو به صورت tmpname_s وجود دارد) استفاده کردم و نام یک فایل موقتی در شاخه فایل های موقتی ویندوز را از آن گرفتم و بعد فایل را باز کردم. چنانچه موفق به باز کردن فایل نمی شدم، مجدداً نام دیگری در خواست می کردم تا بالاخره فایلی بتوانم باز کنم(البته بهتر است محدودیتی برای این کار قرار دهید وگرنه ممکن است در شرایط ویژوه ای برنامه در حلقه بینهایت بیفتد و ...). نهایتاً پس از اینکه کارم با فایل تمام شد، توسط تابع remove در کتابخانه stdio.h که نام فایل را می گیرد، آن فایل موقتی را پاک می کردم. نکته دیگری که در مورد فایل ها وجود دارد، نوع استفاده از آنها می باشد. همانطور که می دانید، فایل ها یا متنی هستند و یا باینری و شما در بالا فایل را به صورت متنی باز کرده اید و اطلاعات در آن ریخته اید و از آن اطلاعات می خوانید ولی می توانید فایل را به صورت باینری نیز باز کنید و اطلاعات در آن بنویسید و یا از آن بخوانید که این روش نیز مزایا و معایبی دارد.
ببخشید که فرصت نکردم بیش از این توضیح دهم.
امیدوارم که مطالب بالا مفید واقع شود.
سوالی بود، در خدمتیم.
یا علی
خدانگهدارتان