2010-03-26 5 views
15

사용되는 OS에 따라 올바른 EOL 문자를 자동으로 사용할 수있는 방법이 있습니까?휴대용 끝의

나는 std::eol과 같은 것을 생각하고 있었습니까?

전 처리기 지시문을 사용하는 것이 매우 쉽지만 이미 사용 가능한지 궁금합니다.

내가 관심을 갖는 부분은 보통 응용 프로그램에 나중에 하나의 문자열로 결합되는 일부 메시지가 있고 그 메시지를 EOL로 분리하려고합니다. 내가 std::stringstream << endl을 사용할 수 있다는 것을 알고 있지만, 때로는 정기적 인 추가 대신 잔인한 것으로 보입니다.

답변

11

std::endl은 스트림에 '\n'을 쓰고 플러시 (flush)하는 것 외에는 아무것도하지 않는 것으로 정의됩니다 (§27.6.2.7). 플러싱은 stringstream에 대해 아무 것도하지 않도록 정의되었으므로 mystringstream << '\n'을 말하는 좋은 방법이 남아 있습니다. OS의 표준 라이브러리 구현은 \n을 적절하게 변환하므로 걱정할 필요가 없습니다.

따라서 endl은 이미 성능과 휴대 성이 뛰어나며 문자열 스트림이 아닌 파일에 효율적으로 쓰려고한다면 << '\n' 만 가능합니다. 음, << '\n'stringbuf::flush으로의 무의미한 가상 전화를 제거합니다. 프로파일 링에서 빈 함수 호출이 시간이 걸리는 것을 보여주지 않는 한 그것에 대해 생각하지 마십시오.

+0

나는 콘솔과 파일에 쓸 때 '\ n 's everywhere를 사용하는 것이 완전히 좋으며 OS (Windows 읽기)가 자동으로 \ r \ n이되도록 처리한다고 생각했습니다. 이 시점에서 그것은 나를 위해 충분하다. – Andrew

+0

@Potatoswatter : 아마도 당신이 가리키고있는 것 (C++ 표준이라고 가정)은 §27.7.3.8 섹션입니까? – sturmer

+0

@sturmer 예, 그 당시의 C++ 03에 대한 참조입니다. 숫자는 변하지 만 섹션의 이름은 [lib.ostream.manip]입니다. 어쨌든, 실제로 볼 수있는 것은 없습니다. 그것은 단지 "Effects : os.put (os.widen ('\ n'))'을 호출하고,'os.flush()'를 호출합니다." – Potatoswatter

2

그냥 텍스트 모드

FILE *fp = fopen("your_file.txt", "w+t"); 

에서 파일을 열고

fprintf(fp, "some string and integer %d\n", i); 
fclose(fp); 

와 OS는 기준에 따라 EOL 처리됩니다.

+7

얼마나 ... C :-) – paxdiablo

+1

Eheh 저는 오래된 학교입니다. XD –

+2

이제 파일을 닫는 것을 잊었습니다. : P – GManNickG

10

당신은 스트림에 행 분리를 작성하려면 다음

std::cout << '\n'; 

또는

std::cout << "\n"; 

또는

std::cout << "whatever you were going to say anyway\n"; 

스트림이 텍스트 모드이며, OS는 무엇을 사용하는 경우 구분 기호로 LF 이외의 다른 문자는 변환됩니다.

당신은 행 분리를 작성하고 스트림 플러시하려면 : 당신이 어떤 이유로 든 바이너리 모드 출력을 가지고, 당신은 플랫폼 별 줄 바꿈을 작성하려는 경우

std::cout << std::endl; 

, 그때 내 생각을 간접적으로해야 할 수도 있습니다 (텍스트 스트림에 '\n' 작성한 다음 얻은 결과를 보려면 이진 모드로 검사하십시오). 아마 내가 알지 못하는 구현에서 줄 바꿈 시퀀스를 직접 얻을 수있는 방법이있을 수 있습니다. 어쨌든 좋은 생각이 아닙니다. 바이너리 모드로 파일을 쓰거나 읽는 경우 OS와 독립적으로 줄 바꿈을 정의하는 형식이거나 줄이 전혀없는 형식이어야합니다. 바이너리 모드는의 경우 입니다.

1

음은 STL은 표준 : ENDL, 당신이 endline을 추가하는 외에, 표준 : ENDL 또한 바람직하지 않은 성능 결과를 초래할 수있는 버퍼를 플러시

std::cout << "Hi five!" << std::endl; 

주를 사용할 수 있습니다.

+1

Err ... 그건 STL이 아니에요. –

+0

BillyONeal에 동의합니다. 또한''\ n ''만을 원하면'std :: endl'이 아니라''\ n ''을 써라. 나는 불필요한'std :: endl'을''\ n''로 대체 한 후에 속도를 8 배로 한 번 봤습니다. – sbi

+0

오, 나는 그것들이 별개의 실재물이라는 것을 몰랐다. 나는 그들이 네임 스페이스를 공유했기 때문에 그것들을 가정했다. 수정 해줘서 고마워. – dimatura

1

텍스트 파일조차도 컴퓨터간에 전송되는 경우가 많으므로 "os 관련 새 줄 문자"는 모순입니다.

winapi multiline 편집 컨트롤이 아니더라도 많은 Windows 프로그램이 \ n 간격의 파일을 올바르게 읽지 만 운영 체제가 그 문제, 특히 한 운영 체제의 Windows에 대해 말하기는 사실입니다. 나는 당신이 당신에게 옳은 것이 무엇인지 두 번 생각해 보길 권한다 : OS가 반드시 권장하는 것은 아니다. 파일이 이동식 미디어에 저장되는 경우 OS 표준을 사용하지 마십시오. 글로벌 표준 인 0xA를 사용하십시오.