windows - hvordan C output LF til stdout uden at blive ændret til CR LF?

Indlæg af Hanne Mølgaard Plasc

Problem



På Windows dette


#include <stdio.h>

int main() { 
    putc('A',stdout);
    putc('
',stdout); 
    putc('
',stdout);
}


udgange


A<CR><CR><LF>


Sådan skriver du bare LF char til stdout uden automatisk konvertering til CR LF?


Jeg har brug for det til at gøre simple socket stream reader til stdout.
Jeg har prøvet bcc32 fra CodeGear, Mingw, Tinycc alle giver samme resultat, skiftende putc til putchar, fputc, fwrite hjælper heller ikke.

Bedste reference


MSVC-løsningen er:


#include <io.h>
#include <fcntl.h>
...
\_setmode(1,\_O\_BINARY)


Andre køretider kan give C99-opløsningen eller en alternativ måde. EDIT: Jeg tror setmode([file number],O\_BINARY) stammer fra Borland Turbo C, og andre kompilatorer til MS-DOS og Windows imiterede det. \_-Prefixet er gjort for at holde navnefeltet rent og kan ikke være til stede på nogle kompilatorer.

Andre referencer 1


En tekstfil konverterer C-karakteren ' ' til den oprindelige linje, der slutter på output, og konverterer den oprindelige linje, der slutter med input til en enkelt ' '.


For at få det resultat, du har brug for, skal du ændre stdout til en binær filstrøm.


Der findes et delvis svar her. Hvis du har et C99-kompatibelt bibliotek, skal du bruge: [12]


if (freopen(0, "wb", stdout) == 0)
    ...oops...operation failed...


vil forsøge at ændre standard output til en binær strøm. Men i Windows kan det 'C99-kompatible bibliotek' være et problem. Nominelt er dette det bærbare (fordi standard) svar. Der er sandsynligvis en Windows-specifik funktion til at gøre det samme job.

Andre referencer 2


Udgiv bare LF tegn, som denne: putc('x0A', stdout)

Andre referencer 3


#ifdef \_WIN32
#include <fcntl.h>
#include <io.h>
#endif

#ifdef \_\_BORLANDC\_\_
#define \_setmode setmode
#endif

#include <stdio.h>

static void binary\_stdout(void) {
#ifdef \_WIN32
    \_setmode(\_fileno(stdout), \_O\_BINARY);
#endif
}

int main(void) {
    binary\_stdout();
    printf("
");
    return 0;
}