I am trying to figure out the cause of my problem in the following post:

http://forum.dlang.org/thread/qfbugjkrerfboqhvj...@forum.dlang.org

and encountered something peculiar about reading strings. Whenever a distinct terminator is indicated in the input format (ex. " %s@", @ being the terminator), readf() leaves the terminator on the input buffer after reading the data. If no terminator is specified the only way to indicate end of input is to use ctrl-d (ctrl-z on windows), however that causes the eof indicator to be set to true and the stream is marked as empty for all future attempts to access stdin.

void main(string[] args)
{
    string s1;
    double d;
    string s2;

    writeln("Enter a @ terminated string (multiline ok):");
    readf(" %s@", &s1);
    auto arr = s1.split();

    if (!stdin.eof()) {
        writeln("The stream is not empty.");
    } else {
        writeln("The stream is empty.");
    }
writeln("Enter another string (terminated with cntrl-d|ctrl-z):");
    readf(" %s", &s2);  // No matter how many read attempts
// are made after this point, none of them will work. // Insert \n after %s to see difference.

    writeln("Enter a decimal value:");
    readf(" %s", &d);
    //readf(" %s", &d);
    //readf(" %s", &d);
    //readf(" %s", &d);
    //readf(" %s", &d);

    if (!stdin.eof()) {
        writeln("The stream is not empty.");
    } else {
        writeln("The stream is empty.");
    }

    writeln("d = ", d);
    writeln("arr = ", arr);
    writeln("s = ", s2);
}

Is there no way to indicate eof without marking the stream (buffer?) as empty for all future uses after encountering cntrl-d/cntrl-z during string input? I would expect to be able to terminate string input with cntrl-d/cntrl-z without rendering the input stream inaccessible.

Thanks,
Andrew

Reply via email to