digitalmars.D - Windows and piped stdin...?
- alex (20/20) Feb 14 2007 Hi,
- alex (3/3) Feb 14 2007 No, sorry, it is NEVER working, not with "main.exe < input file" nor wit...
- Jascha Wetzel (63/68) Feb 18 2007 the problem appears to be in the c runtime that's used via std.c.stdio.
Hi,
Perhaps this is a common known problem, but I have really no idea what it could
be.
Take this piece of code (say, main.d):
import std.stdio;
import std.cstream;
int main(char[][] args) {
while (!din.eof()) {
writefln("in: %s", din.readLine());
}
return 0;
}
This just reads from standard input and outputs until stdin ends.
It seems that Windows does never send an EOF when using like this:
do_some_output | main.exe
The output will never stop printing "in: "
The same program works fine under every flavor of Linux..... It is even working
when using like this in Windows:
main.exe < some_input_file.txt
Some idea what this could be? Is it possible that Windows won't send a EOF on
pipes....?
thanks
alex
Feb 14 2007
No, sorry, it is NEVER working, not with "main.exe < input file" nor with just "main.exe" and putting some text manually in (end with ^Z).... It really seems that no EOF is sent on windows stdin....? any ideas? alex
Feb 14 2007
the problem appears to be in the c runtime that's used via std.c.stdio.
i worked around this by using win32 api directly:
/**
* Wraps win32 stdio functions. Respects io redirection into pipes.
*/
class DbgIO
{
static HANDLE ddb_read, ddb_write;
static char[] buffer;
static this()
{
ddb_read = GetStdHandle(STD_INPUT_HANDLE);
ddb_write = GetStdHandle(STD_OUTPUT_HANDLE);
}
/**
*
*/
static char[] readln()
{
char[128] buf;
uint read;
int nl_index;
do
{
ReadFile(ddb_read, buf.ptr, buf.length, &read, null);
buffer ~= buf[0..read];
nl_index = find(buffer, '\n');
} while ( nl_index < 0 );
char[] ret = buffer[0..nl_index];
buffer = buffer[nl_index+1..$];
return ret;
}
/**
*
*/
static void print(...)
{
char[] str;
void putc(dchar c)
{
str ~= c;
}
doFormat(&putc, _arguments, _argptr);
uint written;
WriteFile(ddb_write, str.ptr, str.length, &written, null);
}
/**
*
*/
static void println(...)
{
char[] str;
void putc(dchar c)
{
str ~= c;
}
doFormat(&putc, _arguments, _argptr);
uint written;
str ~= '\n';
WriteFile(ddb_write, str.ptr, str.length, &written, null);
}
}
alex wrote:
No, sorry, it is NEVER working, not with "main.exe < input file" nor with just
"main.exe" and putting some text manually in (end with ^Z).... It really seems
that no EOF is sent on windows stdin....?
any ideas?
alex
Feb 18 2007








Jascha Wetzel <"[firstname]" mainia.de>