簡體   English   中英

為什么ReadLn不為Delphi中的所有變量賦值?

[英]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還將顯示yz的值

在此示例中,使用ReadLn()是不可靠的,因為它將讀取到第一個空格,將其添加到第一個數字,然后再添加到第二個空格,添加,等等。您正在執行ReadLn,因此除該行的第三個整數將被忽略! 缺失值默認為零。

如果您的數字以空格開頭,則X為空格,因此為零。 Y將是制表符分隔符之前的第一個數字。 Z將是第二個數字前面的第二個空格,因此默認為零。

老實說,我只使用ReadLn()從文本文件中讀取整個字符串。 對於制表符分隔的類型,我傾向於使用各種其他技術,包括使用字符串列表。

ReadLn? hmmm(來自內存)每個變量都期望一行嗎??? 真的不記得了

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM