PDA

View Full Version : چطور می تونم یه رشته رو تو فایل بریزم؟



mbshareat
یک شنبه 07 آذر 1389, 19:23 عصر
با سلام و عرض ادب
من می خوام رشته ای رو تو فایل بریزم و نمی خوام انتهای خط هم تو فایل بریزم که بفرمایین از TSringList استفاده کن!
اول فکر کردم شاید بتوان همونطور که به آسونی می شه آرایه بایت رو به String انتساب داد برعکس هم عمل کرد ولی نشد.
آیا راه دیگه ای سراغ دارین؟ که مثلا رشته 'abc' رو به آسونی تو فایل بریزم؟(فکر کنم سوالم اونقدر آسونه که شک می کنین منظورم چیه؟)
خواهش می کنم زودتر جواب بدین.ممنونم...:کف:
---
(خودمونیم با نمای جدید سایت به هیچ وجه حال نکردم:شیطان:)

Felony
یک شنبه 07 آذر 1389, 20:01 عصر
ما که نفهمیدیم چی میخوای !
میخوای یه رشته رو تو جای مشخصی از فایل درج کنی ؟ فایلت از چه نوعیه ؟ متنیه ؟

mbshareat
یک شنبه 07 آذر 1389, 21:45 عصر
با سلام:لبخند:
جناب استاد تاجیک عزیز:قلب: من می خوام یه رشته معکوس شده رو تو فایل بریزم. فرض کنین چنین چیزی داریم:

Uses
StrUtils,...;
...

procedure SendIntToFile(I:Integer);
var
S:String;
F:File;
Buf:Array[0..2] of Char;
BytesNo:Integer;
Begin
I:=123;
S:=ReverseString(IntTostr(I));
AssignFile(F,'bagher.t');
Rewrite(F,1);
BytesNo:=3;
Buf:=S;
BlockWrite(F,Buf,BytesNo);
End;

من چطور می تونم رشته رو تو فایل بریزم؟(تو خط دو تا مونده به آخر گیر ميده!:افسرده:)

Felony
یک شنبه 07 آذر 1389, 22:41 عصر
خوب الان کجای این کار رو شما نمیتونی با کلاس TStringList انجام بدی ؟!

در هر صورت میتونی تو یک حلقه اون رشته رو به آرایه ای از کارکترها تبدیل کنی .

mbshareat
دوشنبه 08 آذر 1389, 09:35 صبح
با سلام
جناب آقای مجتبی تاجیک:قلب: گرامی از توجهتون ممنونم اما این راه که به ذهن خودم هم می رسید:چشمک:.
به نظر من اگه بخوایم همه داده ها رو تو یه تابع تو آرایه و بعد تو فایل بریزیم این یه نقطه ضعف برای زبان برنامه نویسیه که یه راه ساده و آماده برای ریختن اطلاعات تو فایل نداشته باشه.(از کی تا حالا مبتدیا هم نظر می دن!)
توی VB تو دو خط هم فایل رو باز می کنیم هم رشته رو تو فایل می ریزیم.:تشویق:
اما تو دلفی باید متغیر از نوع فایل بسازیم بعد یه فایل بهش انتساب بدیم بعد نوع باز کردن فایل رو تعیین کنیم بعد بریم به محل مورد نظر بعدش هم با روشی که شما می گین چند خط هم برای آماده کردن رشته بنویسیم و بعد هم تو فایل بریزیم.:بامزه:
در ضمن مثل اینکه یادتون رفته من نمی خوام کارکتر انتهای خط و سر خط (10#13#)هم تو فایل باشه و ممکنه بخوام چندتا رشته تو جاهای مختلف از فایل موجود درج کنم و حتما می دونین که TSringList همه فایل رو یه جا به روش فایل متن باز نویسی می کنه!
راستش از شما خیلی بیش از این جواب انتظار داشتم.
آیا ممکنه استفاده از Handle مشکل رو حل کنه؟:گیج:
ایا راه دیگه ای به جز BlockWrite برای درج رشته یا عدد تو فایل بدون نوع یا با نوع بایت سراغ دارین؟
اگه حوصله جواب دارین بفرمایین آیا لازمه برای ریختن اطلاعات در ابتدای فایل هم از Seek استفاده کنیم؟

Felony
دوشنبه 08 آذر 1389, 10:39 صبح
به نظر من اگه بخوایم همه داده ها رو تو یه تابع تو آرایه و بعد تو فایل بریزیم این یه نقطه ضعف برای زبان برنامه نویسیه که یه راه ساده و آماده برای ریختن اطلاعات تو فایل نداشته باشه.(از کی تا حالا مبتدیا هم نظر می دن!)
نقطه ضعف ؟!
شما خودت این روش رو انتخاب کردی وگرنه دلفی کلاس TFileStream رو برای همین کارها در اختیار برنامه نویس گذاشته ، او شیوه کدنویسی شما مربوط به زمان پاسکال هست .


توی VB تو دو خط هم فایل رو باز می کنیم هم رشته رو تو فایل می ریزیم.
اما تو دلفی باید متغیر از نوع فایل بسازیم بعد یه فایل بهش انتساب بدیم بعد نوع باز کردن فایل رو تعیین کنیم بعد بریم به محل مورد نظر بعدش هم با روشی که شما می گین چند خط هم برای آماده کردن رشته بنویسیم و بعد هم تو فایل بریزیم.
در ضمن مثل اینکه یادتون رفته من نمی خوام کارکتر انتهای خط و سر خط (10#13#)هم تو فایل باشه و ممکنه بخوام چندتا رشته تو جاهای مختلف از فایل موجود درج کنم و حتما می دونین که TSringList همه فایل رو یه جا به روش فایل متن باز نویسی می کنه!
اگر بحث مقایسه دلفی با VB باشه که ... ؛ بماند !

در هر صورت شما تکلیف خودت رو مشخص کن میخوای چی کار کنی ، اگر بحثت فقط ریختن اون مقدار رشته S تو فایل هست که :

procedure SendIntToFile(I:Integer);
var
S:String;
F:File;
BytesNo:Integer;
Begin
S:= ReverseString(IntTostr(I));
AssignFile(F,'D:\bagher.txt');
Rewrite(F, 1);
BytesNo:= Length(S);
BlockWrite(F, Pointer(S)^, BytesNo);
CloseFile(F);
End;


راستش از شما خیلی بیش از این جواب انتظار داشتم.
آیا ممکنه استفاده از Handle مشکل رو حل کنه؟
ایا راه دیگه ای به جز BlockWrite برای درج رشته یا عدد تو فایل بدون نوع یا با نوع بایت سراغ دارین؟
اگه حوصله جواب دارین بفرمایین آیا لازمه برای ریختن اطلاعات در ابتدای فایل هم از Seek استفاده کنیم؟
اگر برای پرسیدن سوالتون وقت بزارید و با جزئیات بیان کنید کاربری که میخواد به شما جواب بده راحت تر منظورتون رو میفهمه و زودتر به جواب میرسید .

mbshareat
دوشنبه 08 آذر 1389, 12:21 عصر
با سلام و عرض ادب و ارادت
جناب آقای تاجیک خیلی خیلی متشکرم(دکمه تشکر رو پیدا نکردم)
ببخشید این قدر زحمت می دم من هنوز کار با فایل رو درست و حسابی بلد نیستم.
میشه لطفا راه ساده استفاده آسون و مختصر از tfileStream رو برای برنامم بنویسید؟
در ضمن اگه به جز BlockWrite راهی سراغ دارین محبت کنین راهنمایی بفرمایین.
-----------
دوست آن است که گیرد دست دوست

vcldeveloper
سه شنبه 09 آذر 1389, 02:18 صبح
آیا ممکنه استفاده از Handle مشکل رو حل کنه؟مشخص نکردید که مشکل تون دقیقا چی هست. در هر حال...

استفاده از توابع سطح پایین کار با فایل ها:


var
hFile : Integer;
S : string;
begin
S := 'This is a test';

hFile := FileOpen('c:\bagher.txt', fmOpenReadWrite or fmShareDenyWrite);
if hFile > 0 then
try
if FileSeek(hFile,0,2) < 0 then
RaiseLastOSError;
if FileWrite(hFile, S[1],Length(S) * SizeOf(Char)) <= 0 then
RaiseLastOSError;
finally
FileClose(hFile);
end;
end;

استفاده از کلاس TStringStream:


var
FileName : string;
S : string;
StrStream : TStringStream;
begin
S := 'This is a test';

FileName := 'c:\bagher.txt';
StrStream := TStringStream.Create('',TEncoding.Unicode);
try
StrStream.LoadFromFile(FileName);
StrStream.Position := StrStream.Size;
StrStream.WriteString(S);
StrStream.SaveToFile(FileName);
finally
StrStream.Free;
end;
end;

استفاده از کلاس TFileStream:


var
S : string;
Stream : TFileStream;
begin
S := 'This is a test';

Stream := TFileStream.Create('c:\bagher.txt',fmOpenReadWrite or fmShareDenyWrite);
try
Stream.Position := Stream.Size;
Stream.Write(S[1], Length(S) * SizeOf(Char));
finally
Stream.Free;
end;
end;

mbshareat
سه شنبه 09 آذر 1389, 13:00 عصر
سلام به همه اساتید بزرگوار
جناب آقای کشاورز خیلی متشکرم.
اونطور که فهمیدم برنامتون رشته رو در انتهای Stream می ریزه.(که البته لابد با تغییر position می تونم جای درج رشته رو تغییر بدم)
دکمه تشکر رو پیدا نکردم.فکر کنم هرچی لازم بود فرمودید.