On Wednesday, 15 April 2015 at 15:17:27 UTC, Jürgen Reichmann
wrote:
On Wednesday, 15 April 2015 at 14:47:46 UTC, armando sano wrote:
Reviving old topic... It is possible to force stdout to write
in binary mode on Windows, see
https://msdn.microsoft.com/en-us/library/tw4k6df8.aspx
In C, the solution is:
-----------------------------
#include <stdio.h>
#include <fcntl.h>
#include <io.h>
/*...*/
int result = _setmode( _fileno( stdout ), _O_BINARY );
if ( result == -1 )
perror ("Cannot set stdout to binary mode");
else
perror ("stdout set to binary mode");
------------------------------
In Python, the solution is:
------------------------------
import platform
if platform.system() == "Windows":
import os, msvcrt
msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
------------------------------
Since D can interface C, it must be possible to do the same in
D? (how, I am not sure)
my humble solution:
void setFileModeBinary(File f)
{
import std.c.stdlib;
version(Windows) {
immutable fd = _fileno(f.getFP);
f.flush();
_setmode(fd, _O_BINARY);
version(DigitalMars) {
// @@@BUG@@@ 4243
immutable info = __fhnd_info[fd];
__fhnd_info[fd] &= ~FHND_TEXT;
}
}
}
Sorry, solution above is no longer valid.
Version below works for DMD 2.066 and 2.067 (tested for X86).
void setFileModeBinary(File f, bool setBinary = true)
{
// extracted from phobos stdio rawWrite
version(Windows) {
import std.stdio, std.c.stdlib;
f.flush(); // before changing translation mode
immutable fd = _fileno(f.getFP);
if (setBinary) {
_setmode(fd, _O_BINARY);
version(CRuntime_DigitalMars) { // D2.067
import core.atomic;
// @@@BUG@@@ 4243
atomicOp!"&="(__fhnd_info[fd], ~FHND_TEXT);
} else version(DigitalMars) { // D2.066
version (Win32) {
import core.atomic;
// @@@BUG@@@ 4243
atomicOp!"&="(__fhnd_info[fd],
~FHND_TEXT);
}
}
} else {
version (MICROSOFT_STDIO) {}
else {
enum _O_TEXT = 0x4000;
}
_setmode(fd, _O_TEXT);
version(CRuntime_DigitalMars) { // D2.067
import core.atomic;
// @@@BUG@@@ 4243
atomicOp!"&="(__fhnd_info[fd], ~FHND_TEXT);
} else version(DigitalMars) { // D2.066
version (Win32) {
import core.atomic;
// @@@BUG@@@ 4243
atomicOp!"|="(__fhnd_info[fd],
FHND_TEXT);
}
}
}
}
}
IMO a function like this belongs in Phobos stdio
jürgen