Io 在这个D示例中,为什么在到达EOF之前会有一个额外的循环?

Io 在这个D示例中,为什么在到达EOF之前会有一个额外的循环?,io,d,Io,D,以下是官方D手册中的一个示例: import std.stdio; import std.string; void main() { File file = File("student_records", "w"); file.writeln("Name : ", "Zafer"); file.writeln("Number: ", 123); file.writeln("Class : ", "1A"); file.close(); Fi

以下是官方D手册中的一个示例:

import std.stdio;
import std.string;

void main()
{
    File file = File("student_records", "w");

    file.writeln("Name  : ", "Zafer");
    file.writeln("Number: ", 123);
    file.writeln("Class : ", "1A");
    file.close();

    File file1 = File("student_records", "r");

    while (!file1.eof()) {
        string line = (chomp(file1.readln()));
        writeln("read line -> |", line);
    }
}
如果您运行它,您将获得:

ldc2 -run file.d
read line -> |Name  : Zafer
read line -> |Number: 123
read line -> |Class : 1A
read line -> |
注意,打印的是空行。现在如果我把第三个writeln改为write

import std.stdio;
import std.string;

void main()
{
    File file = File("student_records", "w");

    file.writeln("Name  : ", "Zafer");
    file.writeln("Number: ", 123);
    file.write("Class : ", "1A");
    file.close();

    File file1 = File("student_records", "r");

    while (!file1.eof()) {
        string line = (chomp(file1.readln()));
        writeln("read line -> |", line);
    }
}
那么最后一个空行将不再打印:

ldc2 -run file.d
read line -> |Name  : Zafer
read line -> |Number: 123
read line -> |Class : 1A

我想知道为什么这会产生不同:readln应该读取到行的末尾,包括行终止符号,为什么当我们显然已经达到EOF时,应该有一个额外的循环?

我的猜测是readln读取到并包括行终止符(
'\n'
),但不到EOF。您的文件如下所示:

Name  : Zafer\n   <---- first readln
Number: 123\n     <---- second readln
Class : 1A\n      <---- third readln
EOF               <---- fourth readln
另一个选项是使用
foreach

foreach(line ; file1.byLine) {
    writeln("read line -> |", line.chomp);
}
上述内容和文档中的示例都避免打印该空行

如上所述,在创建文件时,将最后一个
writeln
替换为
write
,也可以避免打印最后一个空行,因为少了一行
\n
,因此对
readln
的第三次调用直接读取到
EOF
,而不会在最后一次
\n
时停止

foreach(line ; file1.byLine) {
    writeln("read line -> |", line.chomp);
}