Mike Parker:

setmode() should be in unistd.h, but I can't import core.stdc.unistd (and I don't find it in std.c.windows.windows).

core.sys.posix.unistd

I have tried this on Windows32, and it doesn't find much:

import core.sys.posix.unistd: setmode;
import core.sys.posix.stdio: fileno;
import core.stdc.stdio: stdout;
void main() {
    setmode(fileno(stdout), O_BINARY);
}


On StackOverflow I have seen in C on Windows you use something like:
http://stackoverflow.com/questions/9554252/c-c-is-it-possible-to-pass-binary-data-through-the-console


#include <stdio.h>
#include <fcntl.h>
#include <io.h>
int main() {
   int result = _setmode(_fileno(stdin), _O_BINARY);
   return 0;
}


Trying another way I have seen this:
http://bytes.com/topic/c/answers/213649-how-write-binary-data-stdout

This is supposed to be valid code in C99 (despite binary mode is not guaranteed to work on all systems), this gives no errors in D but gives no output to me:


import core.stdc.stdio: stdout, freopen;
import std.stdio: write;
void main() {
    auto f = freopen(null, "wb", stdout);
    assert(f);
    write("hello\n\n");
}

Maybe it's a good idea to put something portable to do that in Phobos... Or maybe core.stdc.stdio.freopen is just not C99 compliant and should be fixed.

Bye,
bearophile

Reply via email to