[英]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.