开发者

how C output LF to stdout without being changed to CR LF?

开发者 https://www.devze.com 2023-03-01 00:38 出处:网络
On Windows this #include <stdio.h> int main() { putc(\'A\',stdout); putc(\'\\r\',stdout); putc(\'\\n\',stdout);

On Windows this

#include <stdio.h>

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

outputs

A<CR><CR><LF>

How to write just LF char to stdout without automatic conversion to CR LF?

I need it to make simple socket stream reader to stdout. I've tried bcc32 from CodeGear, mingw, tinycc all yield same result, changing putc to putchar, fputc, fwri开发者_开发百科te doesn't help either.


The MSVC solution is:

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

Other runtimes may provide the C99 solution or an alternate way. EDIT: I believe setmode([file number],O_BINARY) originated on Borland Turbo C, and other compilers for MS-DOS and Windows imitated it. The _ prefix is done to keep the namespace clean, and may not be present on some compilers.


A text file converts the C character '\n' into the native line ending on output, and converts the native line ending on input into a single '\n'.

To get the result you require, you'd have to change stdout into a binary file stream.

A partial answer is found here. If you have a C99-compliant library, using:

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

will attempt to change standard output to a binary stream. However, on Windows, the 'C99-compliant library' might be a problem. Nominally, this is the portable (because standard) answer. There is likely a Windows-specific function to do the same job.


#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;
}
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号