当使用Delphi的ReadLn
从制表符分隔的文件中读取值到一系列变量时,为什么在我单步执行调试器时,某些变量没有被赋值给适当的值?
即
x, y, z: Integer;
...
ReadLn(fh, x, y, z);
MessageBox(int2Str(y));
...
只有y
有一个值,x和z是0 ...
注意:这是在Mason Wheeler完全有效的答案之后编辑的
答案 0 :(得分:5)
Readln将解析输入以及它可以为您提供的变量类型,但如果您的第一个(名称)是一个字符串,它将读取所有内容直到换行符。如果要加载制表符分隔文件,我将使用TStringList并将分隔符设置为#9。
答案 1 :(得分:1)
这是一个更普遍的问题的症状,特别是试图调试未使用的变量的值。
简而言之:默认情况下,编译器会优化掉未使用的变量
如果以递增方式编写代码,您决定调试并找出,例如ReadLn
过程正确读取变量,您可能会发现值为空或0.除非使用变量稍后在代码中 - 如果你在编写每一行时进行调试可能不是这种情况 - 编译器似乎会优化它们。
我在示例中使用了ReadLn
,因为您可能希望在csv文件的第二列中使用数据,因此必须创建未使用的各种一次性变量。检查一次性变量的值时,您会发现它们不包含您期望的值!
在上面的示例中,您可以通过在代码中稍后“使用”变量来强制调试器加载值,即
x, y, z: Integer;
...
ReadLn(fh, x, y, z);
MessageBox(int2Str(y));
MessageBox(int2Str(x));
MessageBox(int2Str(z));
...
现在,mousover将显示y
和z
的值
答案 2 :(得分:1)
在这个例子中使用ReadLn()是不可靠的,因为它将读取到第一个空格,将其添加到第一个数字,然后添加到第二个空格,添加等等。你正在做一个ReadLn,因此超出该行第三个整数的任何内容都将被忽略!缺失值默认为零。
如果您的数字以空格为前缀,则X将是空格,因此为零。 Y将是第一个到制表符分隔符的数字。 Z将是第二个数字前面的第二个空格,因此默认为零。
老实说,我只使用ReadLn()从文本文件中读取整个字符串。使用制表符分隔的类型,我倾向于使用各种其他技术,包括使用字符串列表。
答案 3 :(得分:0)
ReadLn?嗯(从内存)是否期望每个变量一行???真的不记得......