为什么ReadLn没有为Delphi中的所有变量赋值?

时间:2009-08-07 15:43:32

标签: delphi

当使用Delphi的ReadLn从制表符分隔的文件中读取值到一系列变量时,为什么在我单步执行调试器时,某些变量没有被赋值给适当的值?


x, y, z: Integer;
...
ReadLn(fh, x, y, z);
MessageBox(int2Str(y));
...

只有y有一个值,x和z是0 ...

注意:这是在Mason Wheeler完全有效的答案之后编辑的

4 个答案:

答案 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将显示yz的值

答案 2 :(得分:1)

在这个例子中使用ReadLn()是不可靠的,因为它将读取到第一个空格,将其添加到第一个数字,然后添加到第二个空格,添加等等。你正在做一个ReadLn,因此超出该行第三个整数的任何内容都将被忽略!缺失值默认为零。

如果您的数字以空格为前缀,则X将是空格,因此为零。 Y将是第一个到制表符分隔符的数字。 Z将是第二个数字前面的第二个空格,因此默认为零。

老实说,我只使用ReadLn()从文本文件中读取整个字符串。使用制表符分隔的类型,我倾向于使用各种其他技术,包括使用字符串列表。

答案 3 :(得分:0)

ReadLn?嗯(从内存)是否期望每个变量一行???真的不记得......