كار با فايلهاي خواندني-نوشتني باينري در دلفي

در روشي كه قبلا براي خواندن فايل باينري گفتم، در يك لحظه فقط ميشد يا خواند يا نوشت. مثلا نمي شد كه يك فايل رو هم براي خواندن و هم براي نوشتن باز كرد. براي اين كار، يك سري توابع ديگري در دلفي وجود دارد كه با استفاده از آنها ميشود فايل را خواندني-نوشتني باز كرد به اين معنا كه هم ميتوان از فايل خواند و هم در آن نوشت.
ابتدا بايد يك متغير صحيح براي نگه داشتن دستگيره فايل (file handle) تعريف كنيد:
var n1:integer;
بعد يك بافر براي نگه داشتن اطلاعاتي كه از فايل مي خوانيم تعريف ميكنيم:
buf:array[1..1024]of char;
سپس بايد با استفاده از تابع FileOpen، فايل را باز كرد.
n1:=FileOpen('c:\autoexec.bat',fmOpenReadWrite);
در اينجا دستگيره فايل در متغير n1 ذخيره ميشود. اگر فايل قابل باز شدن نباشد، n1=-1 ميشود. بنابراين ميتوان يك پيام خطا در اين صورت ايجاد كرد.
if n1=-1 then
begin
Showmessage('File not found.');
exit;
end;
توجه داشته باشيد كه وقتي كه مي خواهيد فايلي را هم براي خواندن و هم براي نوشتن باز كنيد، حتما بايد آن فايل وجود داشته باشد.
سپس براي خواندن فايل، از دستور FileRead استفاده ميكنيم.
numread:=FileRead(n1,buf,sizeof(buf));
در اينجا ما مي گيم كه مي خوايم از فايلي n1، به اندازه buf اطلاعات را خوانده و نتيجه را در buf بريزيم. در اينجا ما به اندازه 1024 بايت (1 كيلوبايت) از فايل خوانده ايم. حاصلي كه اين تابع بر مي گرداند، تعداد بايتهايي است كه واقعا خوانده شده اند! چون اگر در نزديك انتهاي فايل قرار داشته باشيم، به طوري كه كمتر از 1024 بايت به انتهاي فايل مانده باشد، ديگر نميتوانيم 1024 بايت از فايل بخوانيم. بنابراين متغير numread ميگويد كه چند بايت خوانده شده است.

حال براي نوشتن در فايل از دستور FileWrite استفاده ميكنيم.
numwrite:=FileWrite(n1,buf,sizeof(buf));
در اينجا ابتدا اطلاعاتي را كه مي خواهيم در فايل بنويسيم را در buf ذخيره كرده و سپس اين متغير را در فايل مي نويسيم.

براي حركت دادن اشاره گر فايل از تابع FileSeek استفاده ميكنيم.
N:=10;
n2:=FileSeek(n1,n,0);
در اينجا ما اشاره گر فايل را به بايت دهم از ابتداي فايل تغيير ميدهيم.
پارامتر سوم اين تابع تعيين كننده اين است كه ما چه طور مي خواهيم اشاره گر را تغيير دهيم. اگر صفر باشد يعني اين كه عددي كه ما به عنوان اشاره گر ميدهيم كه اينجا 10 داديم، از اول فايل حساب شود. اگر 1 باشد بدين معناست كه اشاره گر فايل به اندازه n تا جلو ميرود. يعني اشاره گر فايل را به مقداري كه ما بخواهيم جلو ميبرد. و اگر 2 باشد، از آخر فايل محسوب ميشود يعني اشاره گر فايل n + sizeof(file) ميشود.
حاصلي كه اين تابع بر مي گرداند، اشاره گر فعلي فايل است. يعني تغييرات اشاره گر را اعمال كرده و سپس اشاره گر جديد فايل را بر مي گرداند. بنابراين اگر بخواهيد اشاره گر فعلي فايل را به دست آورديد، بايد از دستور
n2:=FileSeek(n1,0,1);
استفاده كنيد. يعني مي گوييد كه صفر بايت به اشاره گر فعلي فايل اضافه كن. كه نتيجه همان اشاره گر فعلي فايل ميشود (كلك رشتي!!)


  
نویسنده : محمد ; ساعت ۱۱:٥۳ ‎ب.ظ روز دوشنبه ٢٦ خرداد ،۱۳۸٢