PDA

View Full Version : مشکل با متغییر رشته ...



Hamid_PaK
شنبه 17 تیر 1385, 04:15 صبح
با سلام : شرمنده دیگه نمی دوستم باید چی سرچ کنم که پیدا بشه ...
من دارم یک برنامه می نویسم که باید در یک جای یک فایل یکسری رشته ذخیره کنم ولی به یک مشکلی برخوردم !!!
نوع ذخیره سازی نوشته ها در این رشته باید به گونه ای باشه که بین تمامی حروف یک حرف وجود داره که اون کاراکتر 0 هست !!!
وقتی در یک متغییری رشته ای بعد از یک کاراکتر 0 باشه تصور می شود رشته پایان یافته ...
حالا چطوری باید رشته رو پر کرد که در هنگام نوشتن در فایل باینری بین حروف کاراکتر 0 قرار بگیره و تمام رشته نیز نوشته شود ؟؟؟


[f.a.r.s.i] = [#$66#$00#$61#$00#$72#$00#$73#$00#$69]

آیا متغییر خاصی این قابلیت رو دارد ؟؟؟

با تشکر ، یا حق ...

vcldeveloper
شنبه 17 تیر 1385, 06:12 صبح
ShortString نباید با Null مشکلی داشته باشه، اما طولش محدود به 255 کاراکتر هست.

Hamid_PaK
شنبه 17 تیر 1385, 07:07 صبح
مشکل وقتی بوجود می آید که ما می خواهیم اون رو بصورت باینری ذخیره کنیم یک بایت اول این رشته ، طول رشته رو تعیین می کنه که در هنگام ذخیره اضافه می شود ...
ولی ما به این بایت نیازی نداریم و نباید نوشته شود ...
از این روش تنیجه گرفتم ولی یک مشکلی که هست پر کردن این متغغیر است ...


str_tmp: array[0..10] of char;
..
FileWrite( var_file, str_tmp, SizeOf(str_tmp) );

نمی دونم چطوری پرش کنم که از این روش مسخره استفاده نکنم ؟؟؟


str_tmp[0] := #50;
str_tmp[1] := #0;
str_tmp[2] := #60;
...
str_tmp[10] := #90;


یا حق ...

Hamid_PaK
شنبه 17 تیر 1385, 07:37 صبح
اینم راه حل مشکل پر کردن آرایه :


procedure set_doted_name(name: String; var out_name: array of Char; count: Integer);
var
i: Integer;
begin
for i := 0 to (count)-1 do begin
if i mod 2 = 0 then begin
out_name[i] := name[(i div 2)+1];
end else begin
out_name[i] := #0;
end;
end;
end;

set_doted_name( 'test2', str_tmp, SizeOf(str_tmp) );
// str_tmp => #$74#$00#$65#$00#$73#$00#$74#$00#$32


یا حق ...

Hamid_PaK
شنبه 17 تیر 1385, 12:28 عصر
متاسفانه بعد از گذشت مدتی کوتاهی دلیل دوبایتی بودن این فایل باینری رو فهمیدم ... یونیکد !!!
چون این فایل محتویات یونیکد رو نیز ساپورت می کنه هر یک از کاراکترها دارای دو بایت می باشند ...
کسی تابعی برای تبدیل رشته انسی به یونیکد داره ؟؟؟

با تشکر ، یا حق ...

ghabil
شنبه 17 تیر 1385, 16:53 عصر
نیاز به تابع نداره که خود دلفی برات این کار رو انجام میده یعنی اگر مقدار String رو بریزی توی یک wideString کامپیلر خودش این کار رو میکنه و همینطور برعکس اما در برعکس دلفی با توجه به Locale سیستمی که روش هست عمل تایپکست رو انجام میده ، که ممکنه باعث از دست دادن دیتا بشه (در زبانهای غیر انگلیسی).

Hamid_PaK
یک شنبه 18 تیر 1385, 06:38 صبح
اگر مقدار String رو بریزی توی یک wideString کامپیلر خودش این کار رو میکن

متغییر من از نوع PWideChar هست !!!
و همین طوری با مقدار دهی کار نکرد ، تست کردم این عمل با روال StringToWideChar بدرستی صورت می گیرد ...

با تشکر ، یا حق ...