как C выводит LF в стандартный вывод, не будучи измененным на CR LF? - PullRequest
5 голосов
/ 28 апреля 2011

В Windows это

#include <stdio.h>

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

выводит

A<CR><CR><LF>

Как записать только LF char в стандартный вывод без автоматического преобразования в CR LF?

Мне нужно, чтобы сделать простой поток чтения сокетов на стандартный вывод.Я пробовал bcc32 из CodeGear, mingw, tinycc - все дают один и тот же результат, изменение putc на putchar, fputc, fwrite тоже не помогает.

Ответы [ 3 ]

11 голосов
/ 28 апреля 2011

Решение MSVC:

#include <io.h>
#include <fcntl.h>
...
_setmode(1,_O_BINARY)

Другие среды выполнения могут предоставить решение C99 или альтернативный способ. РЕДАКТИРОВАТЬ: Я считаю, setmode([file number],O_BINARY) возникла на Borland Turbo C, и другие компиляторы для MS-DOS и Windows имитировали его. Префикс _ сделан для поддержания чистоты пространства имен и может отсутствовать в некоторых компиляторах.

2 голосов
/ 28 апреля 2011

Текстовый файл преобразует символ C '\n' в собственную строку, заканчивающуюся на выходе, и преобразует собственную строку, заканчивающуюся на вводе, в один '\n'.

Чтобы получить требуемый результат,необходимо преобразовать stdout в поток двоичных файлов.

Частичный ответ найден здесь .Если у вас есть C99-совместимая библиотека, то:

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

попытается изменить стандартный вывод в двоичный поток.Однако в Windows может возникнуть проблема с C99-совместимой библиотекой.Номинально это портативный (потому что стандартный) ответ.Вероятно, есть функция, специфичная для Windows, для выполнения той же работы.

1 голос
/ 29 апреля 2018
#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("\n");
    return 0;
}
...