نقل قول: مشکل هنگام نوشتن در فایل
Buf1,Buf2 آرایه های داینامیک هستند که اندیسشون از 0 شروع میشه نه از 1.
نقل قول: مشکل هنگام نوشتن در فایل
این همه کد برای این کار چه معنی داره ؟ اصلا چرا فایل ها رو به اون روش باز کردید ؟ برای باز کردن فایلهای متنی و کار با اونها در دلفی از کلاس TStringList استفاده کنید .
نقل قول: مشکل هنگام نوشتن در فایل
با سلام و عرض تبریک به مناسبت میلاد با سعادت حضرت امام رضا (ع):لبخند:
جناب SAASTN
آیا نوع آرایه باعث شده که [Buf2[1 در تابع مقداری داشته باشد و خارج از آن مقداری دیگر؟:متعجب:
نقل قول:
برای باز کردن فایلهای متنی و کار با اونها در دلفی از کلاس TStringList استفاده کنید .
آقای مجتبی تاجیک بزرگوار
آیا استفاده از روش باینری برای باز کردن فایل سریعتر نیست؟(در ضمن فکر کنم کدی که نوشتم از کدی که برای استفاده از TStringList لازمه کمتر باشه!)
من آشنایی لازم رو نسبت به ارسال آرایه به تابع و همچنین کار با فایلها و خوندن رشته از فایل ندارم:اشتباه:
(تو VB خیلی ساده می گیم رشته با فلان طول رو بخون اما تو دلفی به این آسونی نیست)
در هر صورت من باید علت این امر رو بدونم؛ چون همیشه که با فایل متن سر و کار ندارم.:متفکر:
اگه لطف کنین جواب سوالم رو بدین یا عنایت کنین کدی که نوشتم اصلاح کنین و برام بذارین ممنون می شم!:کف:
-------
ندانستن عیب نیست، نپرسیدن عیب است!
نقل قول: مشکل هنگام نوشتن در فایل
function NoCrLf(const InputStr: string): string;
const
sCRLF = '#13#10';
begin
/// Replace CRLF with space character
Result := StringReplace(InputStr,sCRLF,' ', [rfReplaceAll]);
/// Remove duplicated spaces.
Result := StringReplace(Result,' ',' ',[rfReplaceAll]);
/// Correct inverted parantheses
Result := StringReplace(Result,')(','()',[rfReplaceAll]);
end;
procedure SaveWithNoCrLf(const InputFileName, OutputFileName: string);
var
InputStream, OutputStream : TStringStream;
OutStr : string;
begin
if not FileExists(InputFileName) then
raise Exception.Create('File not found');
OutputStream := nil;
InputStream := TStringStream.Create;
try
InputStream.LoadFromFile(InputFileName);
OutStr := NoCrLf(InputStream.DataString);
OutputStream := TStringStream.Create(OutStr);
OutputStream.SaveToFile(OutputFileName);
finally
InputStream.Free;
OutputStream.Free;
end;
end;
نقل قول: مشکل هنگام نوشتن در فایل
با سلام و عرض ادب
جناب کشاورز عزیز:قلب:
دستتون درد نکنه :تشویق:
ببخشید در مورد کدی که شما زحمت کشیدین اظهار نظر می کنم، اما برنامتون دقیقا معادل کد من نیست:
تابع NoCrLf دقیقا معادل کد من نیست!
من می خوام اگه فایل از قبل هم موجود بوده بدون پیغام خودش یه فایل خالی بسازه!
یه سوال هم داشتم (فعلا فقط برای کنجکاوی می پرسم):
آیا می شه فایل روی دیسک نباشه فقط تو حافظه باشه؟(فکر کنم باید با tfilestream بشه:گیج:)
نقل قول: مشکل هنگام نوشتن در فایل
نقل قول:
آیا نوع آرایه باعث شده که [Buf2[1 در تابع مقداری داشته باشد و خارج از آن مقداری دیگر؟
اتفاقی که افتاده این نیست مقادیر موجود در Buf2 تغییر کرده باشه. فقط بخاطر تغییر در تعریف نوع متغیر در روال SaveNoCrLfButClick و تعریف نوع پارامتر در روال NoCrLf یک تغییر یک واحدی در اندیس ها اتفاق افتاده.
در ابتدا شما Buf1 و Buf2 رو اینطور تعریف کردید:
Buf1,Buf2:Array[1..32000]of Char;
خوب اینجا شما یه آرایه استاتیک با Range مشخص تعریف کردید که اندیس عناصرش از 1 شروع میشه. عنصر ابتدایی: عنصر یکم.
اما در روال بعدی Buf1 و Buf2 به اینصورت تعریف شدن:
Procedure NoCrLf(Var Buf1,Buf2:Array of Char;Var BytesNo:Integer);
اینجا این دو پارامتر بصورت آرایه های داینامیک تعریف شدن که همیشه اندیسهاشون از 0 شروع میشه. عنصر ابتدایی: عنصر صفرم! در واقع Buf1[1] در NoCrLf معادل Buf1[2] در SaveNoCrLfButClick هست.
اگر شما تمایلی به تغییر ساختار کدتون به روشهایی که دوستان پیشنهاد کردند ندارید، برای اصلاح کد خودتون دو روش دارید(به نظر من): اول اینکه یکسانسازی نکنید. مثلا اندیس ها رو در NoCrLf از 0 شروع کنید و در SaveNoCrLfButClick از 1. روش دوم این که یکسانسازی بکنید! مثلا این که تعریف نوعتون در SaveNoCrLfButClick رو تغییر بدین و Range آرایه رو از 0 تا n-1 تعریف کنید. یا برای قشنگتر کردنش هم بهتره خودتون یه نوع جدید تعریف کنید:
type
TMyCharArray = array [0 .. 31999] of Char;
...
Procedure NoCrLf(Var Buf1,Buf2:TMyCharArray;Var BytesNo:Integer);
...
procedure TForm1.SaveNoCrLfButClick(Sender: TObject);
Var
F1,F2:File;
Buf1,Buf2: TMyCharArray;
...
اگر هم از 32000 کاراکتری بودن فایلتون مطمئن نیستید:
type
TMyCharArray = array of Char;
شایدم کلا چرند گفتم! ولی آقا کلا برو سراق همون StringList و با همون حلش کن، خیلی نیازی به این شلوغ کاریا نیست.
نقل قول: مشکل هنگام نوشتن در فایل
نقل قول:
ببخشید در مورد کدی که شما زحمت کشیدین اظهار نظر می کنم، اما برنامتون دقیقا معادل کد من نیست
من فقط چند موردی که در کدتان دیدم را نوشتم، تستش هم نکردم. اما می تونید با همین روش، حالت های دیگه را هم بهش اضافه کنید.
نقل قول:
من می خوام اگه فایل از قبل هم موجود بوده بدون پیغام خودش یه فایل خالی بسازه!
خب، به جای اون raise Exception در خط دوم تابع، می تونید کد مربوط به ایجاد فایل رو بنویسید. برای این کار می تونید از تابع CreateFile ویندوز استفاده کنید.
نقل قول:
آیا می شه فایل روی دیسک نباشه فقط تو حافظه باشه؟(فکر کنم باید با tfilestream بشه:گیج:)
در اون مثال، از متد LoadFromFile استفاده شده تا داده از فایل خوانده بشه. اگر فرضا داده شما در فایل نیست، می تونید با استفاده از متد LoadFromStream، یا متد Write داده مورد نظرتون رو در داخل Stream برزید، و باهاش کار کنید.
نقل قول: مشکل هنگام نوشتن در فایل
نقل قول:
نوشته شده توسط
علی کشاورز
function NoCrLf(const InputStr: string): string;
const
sCRLF = '#13#10';
begin
/// Replace CRLF with space character
Result := StringReplace(InputStr,sCRLF,' ', [rfReplaceAll]);
/// Remove duplicated spaces.
Result := StringReplace(Result,' ',' ',[rfReplaceAll]);
/// Correct inverted parantheses
Result := StringReplace(Result,')(','()',[rfReplaceAll]);
end;
procedure SaveWithNoCrLf(const InputFileName, OutputFileName: string);
var
InputStream, OutputStream : TStringStream;
OutStr : string;
begin
if not FileExists(InputFileName) then
raise Exception.Create('File not found');
OutputStream := nil;
InputStream := TStringStream.Create;
try
InputStream.LoadFromFile(InputFileName);
OutStr := NoCrLf(InputStream.DataString);
OutputStream := TStringStream.Create(OutStr);
OutputStream.SaveToFile(OutputFileName);
finally
InputStream.Free;
OutputStream.Free;
end;
end;
با تشکر از جناب کشاورز
برای برداشتن علامت آخر فایل چکار باید کرد.توضیح اینکه بانک تجارت در فایل تکس ارسالی برای مشتریان در انتهای فایل علامتی دارد که در موقع انتقال به برنامه کاربردی ایجاد اشکال در خواندن فایل مینماید.چطوری علامت انتهای فایل را از طریق برنامه حذف کرد؟ متشکرم
نقل قول: مشکل هنگام نوشتن در فایل
نقل قول:
با تشکر از جناب کشاورز
برای برداشتن علامت آخر فایل چکار باید کرد.توضیح اینکه بانک تجارت در فایل تکس ارسالی برای مشتریان در انتهای فایل علامتی دارد که در موقع انتقال به برنامه کاربردی ایجاد اشکال در خواندن فایل مینماید.چطوری علامت انتهای فایل را از طریق برنامه حذف کرد؟ متشکرم
اگر تعداد اون کارکترها مشخص هست، می تونید با تابع Copy، یا Delete، اونها را از string دریافتی حذف کنید. می تونید از همین StringReplace هم استفاده کنید. راه های مختلفی هست.