我已經寫了一個Delphi函數,用於將.dat文件中的數據加載到字符串列表中。然後它解碼字符串列表並分配給一個字符串變量。該字符串的內容使用'#'符號作爲分隔符。如何循環使用分隔字符串並將字符串內容分配給本地delphi變量?
我該如何獲得這個字符串的內容,然後將其內容分配給局部變量?
// Function loads data from a dat file and assigns to a String List.
function TfrmMain.LoadFromFile;
var
index, Count : integer;
profileFile, DecodedString : string;
begin
// Open a file and assign to a local variable.
OpenDialog1.Execute;
profileFile := OpenDialog1.FileName;
if profileFile = '' then
exit;
profileList := TStringList.Create;
profileList.LoadFromFile(profileFile);
for index := 0 to profileList.Count - 1 do
begin
Line := '';
Line := profileList[Index];
end;
end;
其被解碼的VAR「行」之後包含的東西看起來是這樣的:
例如:
Line '23#80#10#2#1#...255#'.
並不是所有的隔板之間的值是相同的長度和每次調用函數LoadFromFile時,「Line」的值都會有所不同(例如,有時一個值可能只有一個數字,接下來的兩個或三個等等,所以我不能依賴字符串或數組的Copy函數)。我試圖找出循環「線」的內容,將其分配給稱爲「緩衝區」的局部變量,然後如果它遇到了「#」,然後將緩衝區的值分配給一個局部變量,重新初始化緩衝區爲'';然後移動到「Line」中的下一個值,每次重複忽略「#」的下一個參數的處理。
我覺得我一直在研究這個問題太久了,我似乎無法取得任何進展,需要休息一下。如果有人願意看看,我會歡迎任何有關如何實現這一目標的建議。
非常感謝
KD
是文件單行還是多行#限制行? – 2012-08-14 15:34:30
它似乎你沒有免費profileList。這是內存泄漏。如果你需要在解析每行之前將文件拆分爲行,那麼你應該使用try-finally來釋放該對象。查看@UweRaabe的答案 - 並使用創建和釋放profileList的相同模式。外殼「profileList」表明你來自Java的土地或類似的東西。這裏沒有垃圾收集是Delphi。如果你創造了一些東西 - 你有責任釋放它。儘管有引用計數的接口,就像我在答案中提到的IJclStringList。他們將被編譯器釋放。 – 2012-08-14 15:35:54
如果文件沒有多行,但是隻有一行,那麼你應該將它讀入字符串變量而不是字符串列表。 – 2012-08-14 15:36:36