View Full Version : سوال: چطور یه عدد رو در فایل جایگزین یک عدد دیگه بکنم؟
mbshareat
یک شنبه 03 فروردین 1399, 12:47 عصر
Procedure FileChangeFirstWord(FileName:String;W1,W2:Word);
var
fs: TFileStream;
I:LongWord;
W:Word;
begin
fs := TFileStream.Create(FileName, fmOpenReadWrite or fmShareDenyNone);
try
For I:=0 To (fs.Size Div 2)-1 Do
Begin
//fs.Seek(I, soFromBeginning);
fs.Position:=I;
fs.ReadBuffer(W,2);
If W=W1 then
Begin
fs.Position:=I;
fs.WriteBuffer(W2,2);
Exit;
End;
End;
finally
fs.free;
end;
end;
سلام
چرا برنامه به خط TFileStream.Create گیر میده.
آیا استفاده از fs.Position به جای seek اشکال داره؟
و وقتی Exit اجرا میشه فایل بسته خواهد شد؟
کسی میتونه کد درست رو برام بذاره؟
golbafan
سه شنبه 05 فروردین 1399, 02:21 صبح
شما وقتی بافر رو میخونی خود به خود پوینتر 2 واحد میره جلو و برای همین روی پوزیشن خطا میخوره
در ضمن شما دو بایت میخونی باز میری روی I ؟؟
mbshareat
شنبه 09 فروردین 1399, 09:13 صبح
بله متوجه شدم که نباید دو تا دو تا بخونم.اما سوال اصلیم این نبود.برنامه به سطر ایجاد فایل گیر میده. نمی دونم کدی که قبل از این پروسیجر اجرا میشه ایراد داشته یا نه؟(باید این پروسیجر رو مستقل اجرا کنم)
Function FileHasWord(FileName:String;W:Word):Boolean;
var
fs: TFileStream;
I:LongWord;
W2:Word;
begin
Result:=False;
fs := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
try
For I:=0 To (fs.Size Div 2)-1 Do
Begin
//fs.Seek(I, soFromBeginning);
fs.Position:=I;
fs.ReadBuffer(W2,2);
If W2=W then
Begin
Result:=True;
Exit;
End;
End;
finally
fs.free;
end;
end;
اینکه می پرم جای قبلی به خاطر جایگزنینه.
میتونم ابتدای پروسیجر بالا رو اینطور تغییر بدم
fs := TFileStream.Create(FileName, fmOpenReadWrite);
try
For I:=0 To fs.Size-1 Do
حد اقل بگید ساختار باز کردن فایل درسته یا نه؟من می ترسم با این پروسیجر FileHasWord فایل درست بسته نشده باشه!؟
mbshareat
سه شنبه 12 فروردین 1399, 10:04 صبح
کسی راهنمایی نمی کنه؟
چطور یک عدد رو در فایل پیدا کنیم و با یک عدد دیگه جایگزین کنیم؟
golbafan
چهارشنبه 13 فروردین 1399, 01:42 صبح
این کد نحوه باز کردن فایل و نمایش بایت ها بصورت HEX هست
امیدوارم کمک کنه
procedure TForm1.FileViewHex(FileName: string);
const
MaxLineLength = 16 * 3; // each byte displayed with 2 characters plus a space
BufferSize = 4096;
var
DataFile: File;
Buffer: array[1..BufferSize] of byte;
BytesRead, I: integer;
HexByte, Line: string;
begin
AssignFile(DataFile, FileName);
Reset(DataFile, 1);
Memo1.Clear;
while not Eof(DataFile) do begin
BlockRead(DataFile, Buffer, BufferSize, BytesRead);
Line := '';
for I := 1 to BytesRead do begin
HexByte := IntToHex(Buffer[I], 1); // convert a byte to hexadecimal
// Add leading 0 if result is shorter than 2, easier to read...
if Length(HexByte) < 2 then HexByte := '0' + HexByte;
Line := Line + HexByte + ' ';
if Length(Line) >= MaxLineLength then begin
Memo1.Lines.Add(Line);
Line := '';
end;
end;
end;
// If not already added, add last line to TMemo
if Length(Line) > 0 then Memo1.Lines.Add(Line);
CloseFile(DataFile);
end;
mbshareat
شنبه 16 فروردین 1399, 02:43 صبح
ممنون.اما جواب سوالم این نیست. دیگه دارم فکر می کنم شاید غیر ممکنه فایل رو باز کرد یه عدد در اون پیدا کرد و با یه عدد دیگه جایگزین کرد.چون یه سوال خیلی ساده است.
یوسف زالی
سه شنبه 19 فروردین 1399, 22:55 عصر
سلام. غیر ممکن چی؟
دقیقا مشکلت در کدوم قسمته؟ طول عددت رو از قبل می دونی یا نه؟
pe32_64
چهارشنبه 20 فروردین 1399, 21:09 عصر
درود
اول باید باید ساختار فایل رو بدونید.ساختار فایل متنی هستش یا باینری؟
اگر متنی بود مثلا خط به خط یا کلمه به کلمه میخونید . بعد که عدد مورد نظر پیدا شد ، جایگزینش میکنید .
اگر باینری بود باید توجه کرد به چه فرمتی ذخیره شده .
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.