2011-04-28 1 views
4

어떻게 CR LF로 변경하지 않고 C 출력 LF를 표준 출력으로 출력합니까? Windows에서

#include <stdio.h> 

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

출력

CR LF로 자동 변환없이 표준 출력 단지 LF 문자를 작성하는 방법을
A<CR><CR><LF> 

?

표준 소켓 스트림 리더를 표준 출력으로 만들려면이 어댑터가 필요합니다. CodeGear, mingw, tinycc에서 bcc32를 시도해 보았습니다. 결과는 putchar을 putchar, fputc, fwrite로 바꾸어도 마찬가지입니다.

답변

10

MSVC 솔루션입니다 :

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

다른 런타임은 C99 솔루션 또는 다른 방법을 제공 할 수있다. 편집 : 나는 setmode([file number],O_BINARY) Borland Turbo C 및 MS-DOS 및 Windows 용 다른 컴파일러에서 유래 믿습니다. _ 접두사는 네임 스페이스를 깨끗하게 유지하기 위해 수행되며 일부 컴파일러에서는 제공되지 않을 수 있습니다. 이 같은

+0

하지만 그것은 파일 이름으로'NULL'을 전달하는 것을 지원하지 않으며 시작하는 stdout은 반드시 파일 이름을 필요로하지 않습니다. – Random832

+0

감사합니다. tiocc와 mingw에 포함 된 io.h가 없어도 작동합니다. bcc32 io.h를 포함해야하며 _setmode를 setmode로 변경하십시오. –

+0

Windows 10부터는 (적어도) 이것은 충분하지 않습니다. 콘솔은 자체 번역을 수행하며, DISABLE_NEWLINE_AUTO_RETURN 콘솔 모드를 설정하여 별도로 비활성화해야합니다. (상수는 Windows 10 SDK에 정의되어 있지만 Windows 8 SDK에는 정의되어 있지 않습니다.) – AnT

1

텍스트 파일은 C 문자 '\n'을 출력시 끝나는 기본 줄로 변환하고 입력시 끝나는 기본 줄을 단일 '\n'으로 변환합니다.

결과를 얻으려면 stdout을 이진 파일 스트림으로 변경해야합니다.

부분 응답은 here입니다. C99 호환 라이브러리가있는 경우 다음을 사용하십시오.

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

표준 출력을 2 진 스트림으로 변경하려고 시도합니다. 그러나 Windows에서는 'C99 호환 라이브러리'가 문제가 될 수 있습니다. 명목상으로 이것은 휴대용 (표준이기 때문에) 대답입니다. 동일한 작업을 수행하는 Windows 관련 기능이있을 수 있습니다.

+0

사용'freopen을()'. –

+0

@ Iggnacio : 네, 고마워요. - 우리가 살고, 우리가 배우고, 질문에 대답합니다. –

+0

@James :'freopen()'함수는 버전 7 유닉스부터' '에 있었지만 C99에서는 파일 이름에 대한 널 포인터를 사용하는 동작이 새로 추가되었습니다. C89 표준은 널 포인터에 대해서는 아무 것도 말하지 않습니다. –

0

그냥 출력 LF 문자 : putc('\x0A', stdout)

+0

아마, 당신은''\ x0A ''을 염두에 두었습니다; ' '\ 0x0A' '표기법은 사실 NUL, x, 0, A의 4 문자를 포함하는 다중 문자 상수입니다. 결과는 구현에 따라 정의됩니다 (그래서 당신은 그것이 무엇인지를 확실하게 결정할 수 있지만, 플랫폼 간 또는 단일 플랫폼상의 컴파일러 간). –

+0

조나단, 고마워. – qrdl

관련 문제