[英]Why does ReadLn not assign values to all my variables in Delphi?
當使用Delphi的ReadLn
將制表符分隔的文件中的值讀取為一系列變量時,為什么在逐步調試程序時某些變量沒有分配為適當的值?
即
x, y, z: Integer;
...
ReadLn(fh, x, y, z);
MessageBox(int2Str(y));
...
只有y
有一個值,x和z為0 ...
注意:本文是在梅森·惠勒的完全有效答案之后編輯的
Readln會針對輸入的變量類型對輸入進行盡可能多的解析,但是如果您的第一個(名稱)是字符串,它將讀取直到換行符為止的所有內容。 如果要加載制表符分隔的文件,我將使用TStringList並將分隔符設置為#9。
這是更一般的陷阱的症狀,尤其是嘗試調試未使用的變量的值。
簡而言之: 默認情況下,編譯器會優化掉未使用的變量
如果以增量方式編寫代碼時,您決定調試並發現ReadLn
過程正在正確讀取變量,則可能會發現該值為空或0。除非稍后在代碼中使用了這些變量-如果您在編寫每行時都在調試,則情況並非如此-編譯器似乎在優化它們。
在示例中,我使用了ReadLn
,因為它很可能是您想使用csv文件第二欄中的數據,因此必須創建各種未使用的一次性變量。 在檢查一次性變量的值時,您會發現它們不包含您期望的值!
在上面的示例中,您可以通過在代碼的后面“使用”變量來強制調試器加載vlaues,即
x, y, z: Integer;
...
ReadLn(fh, x, y, z);
MessageBox(int2Str(y));
MessageBox(int2Str(x));
MessageBox(int2Str(z));
...
現在,mousover還將顯示y
和z
的值
在此示例中,使用ReadLn()是不可靠的,因為它將讀取到第一個空格,將其添加到第一個數字,然后再添加到第二個空格,添加,等等。您正在執行ReadLn,因此除該行的第三個整數將被忽略! 缺失值默認為零。
如果您的數字以空格開頭,則X為空格,因此為零。 Y將是制表符分隔符之前的第一個數字。 Z將是第二個數字前面的第二個空格,因此默認為零。
老實說,我只使用ReadLn()從文本文件中讀取整個字符串。 對於制表符分隔的類型,我傾向於使用各種其他技術,包括使用字符串列表。
ReadLn? hmmm(來自內存)每個變量都期望一行嗎??? 真的不記得了
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.