문제

많은 C ++ 책에는 이와 같은 예제 코드가 포함되어 있습니다 ...

std::cout << "Test line" << std::endl;

... 그래서 나도 항상 그렇게했습니다. 그러나 대신 이와 같은 작업 개발자로부터 많은 코드를 보았습니다.

std::cout << "Test line\n";

다른 하나보다 선호해야 할 기술적 인 이유가 있습니까, 아니면 코딩 스타일의 문제입니까?

도움이 되었습니까?

해결책

파일이 텍스트 모드에서 열려 있다고 가정 할 때 다양한 라인 끝 문자는 중요하지 않습니다. 이진을 요구하지 않는 한 얻을 수 있습니다. 컴파일 된 프로그램은 컴파일 된 시스템의 올바른 것을 기록합니다.

유일한 차이점은 그 것입니다 std::endl 출력 버퍼를 플러시합니다 '\n' 그렇지 않습니다. 버퍼를 자주 플러시하는 것을 원하지 않으면 사용하십시오. '\n'. 그렇다면 (예를 들어, 모든 출력을 얻으려면 프로그램이 불안정하다면) 사용하십시오. std::endl.

다른 팁

차이점은 다음과 같이 설명 할 수 있습니다.

std::cout << std::endl;

동일합니다

std::cout << '\n' << std::flush;

그래서,

  • 사용 std::endl 출력에 즉시 플러시를 강제하려면.
  • 사용 \n 성능이 걱정된다면 (아마도 << 운영자).

나는 사용한다 \n 대부분의 라인에서.
그런 다음 사용하십시오 std::endl 단락의 끝에 (그러나 그것은 단지 습관 일뿐 아니라 일반적으로 필요하지 않습니다).

다른 주장과는 달리 \n 스트림이 파일로 이동하는 경우에만 문자가 올바른 플랫폼 끝에 매핑됩니다 (std::cin 그리고 std::cout 특별하지만 여전히 파일 (또는 파일과 같은)이라는 것).

성능 문제가있을 수 있습니다. std::endl 출력 스트림의 플러시를 강요합니다.

나는 표준에서 이것에 대해 읽는 것을 회상했다. 그래서 여기에 간다 :

C ++ 프로그램이 CRT를 인터페이스하기 때문에 표준 스트림이 어떻게 작동하는지 정의하는 C11 표준을 참조하십시오. C11 표준은 여기에서 플러싱 정책을 관리해야합니다.

ISO/IEC 9899 : 201x

7.21.3 §7

프로그램 시작시 3 개의 텍스트 스트림이 사전 정의되어 있으며 표준 입력 (기존 입력을 읽음), 표준 출력 (기존 출력 작성) 및 표준 오류 (진단 출력 작성). 처음에 열린대로 표준 오류 스트림은 완전히 버퍼링되지 않습니다. 스트림이 대화식 장치를 참조하지 않도록 결정할 수있는 경우에만 표준 입력 및 표준 출력 스트림이 완전히 버퍼링됩니다.

7.21.3 §3

스트림이 부패하지 않은 경우, 캐릭터는 가능한 빨리 소스 나 대상에 나타납니다. 그렇지 않으면 문자가 블록으로서 호스트 환경으로 또는 또는 전송 될 수 있습니다. 스트림이 완전히 버퍼링되면, 버퍼가 채워질 때 문자는 블록으로 호스트 환경으로 또는 호스트 환경으로 전송되도록 의도됩니다. 스트림이 라인 버퍼링되면, 캐릭터는 새 라인 문자가 발생할 때 블록으로 호스트 환경으로 또는 전송되도록 의도됩니다. 또한 버퍼가 채워질 때 문자는 호스트 환경으로 블록으로 전송되거나, 부패하지 않은 스트림에서 입력을 요청할 때, 또는 호스트 환경에서 문자를 전송 해야하는 라인 버퍼 스트림에 입력이 요청 될 때. . 이러한 특성에 대한 지원은 구현 정의되어 있으며 SETBUF 및 SETVBUF 함수를 통해 영향을받을 수 있습니다.

이것은 그것을 의미합니다 std::cout 그리고 std::cin 완전히 버퍼링되어 있습니다 경우에만 그들은 비 중 활성화 장치를 참조하고 있습니다. 다시 말해, STDOUT가 터미널에 부착되면 행동에는 차이가 없습니다.

그러나 if std::cout.sync_with_stdio(false) 그러면 호출됩니다 '\n' 대화 형 장치에 플러시를 유발하지 않습니다. 그렇지 않으면 '\n' 동일합니다 std::endl 파일에 배관하지 않는 한 : std :: endl의 c ++ ref.

사용하려는 경우 거기에 암시 된 또 다른 기능 호출이 있습니다. std::endl

a) std::cout << "Hello\n";
b) std::cout << "Hello" << std::endl;

a) 호출 연산자 << 한 번.
b) 연산자에게 전화를 겁니다 << 두 배.

둘 다 적절한 종말 문자를 쓸 것입니다. 그 외에도 endl은 버퍼를 커밋하게합니다. 불필요한 커밋이 성능에 영향을 줄 수 있기 때문에 파일 I/O를 수행 할 때 일반적으로 EndL을 사용하고 싶지 않습니다.

큰 문제는 아니지만 endl은 작동하지 않습니다 안에 부스트 :: 람다.

(cout<<_1<<endl)(3); //error

(cout<<_1<<"\n")(3); //OK , prints 3

QT와 ENDL을 사용하는 경우 실수로 잘못을 사용할 수 있습니다. endl, 오늘 나에게 일어 났고 나는 ..wtf ??

#include <iostream>
#include <QtCore/QtCore> 
#include <QtGui/QtGui>
//notice that i dont have a "using namespace std;"
int main(int argc, char** argv)
{
    QApplication qapp(argc,argv);
    QMainWindow mw;
    mw.show();
    std::cout << "Finished Execution !" << endl << "...";
    // Line above printed: "Finished Execution !67006AB4..."
    return qapp.exec();
}

물론 그게 내 실수였습니다. std::endl, 그러나 당신이 사용하는 경우 endl, qt and using namespace std; 올바른 경우 포함 파일의 순서에 따라 다릅니다. endl 사용하게 될 것이다.*

물론 네임 스페이스를 사용하기 위해 QT를 다시 컴파일 할 수 있으므로 위의 예제에 대한 컴파일 오류가 발생합니다.

편집 : 언급하는 것을 잊어 버렸습니다 endl Qtcore의 일부인 "Qtextstream.h"에서 선언됩니다.

*edit2 : c ++는 올바른 것을 선택합니다 endl 당신이있는 경우 using ~을 위한 std::cout 또는 네임 스페이스 std, 부터 std::endl 동일한 네임 스페이스에 있습니다 std::cout, C ++의 ADL 메커니즘이 선택됩니다 std::endl.

나는 항상 std :: endl을 사용하는 습관이있었습니다.

와 함께 참조 이것은 an입니다 출력 전용 I/O 조작기.

std::endl 출력 시퀀스 OS에 Newline 문자를 삽입하고 마치 호출하여 마치 플러시합니다. os.put(os.widen('\n')) 그 뒤에 os.flush().

사용시기 :

이 조작기는 라인을 생성하는 데 사용될 수 있습니다. 즉시 출력,

예를 들어

장기 실행 프로세스에서 출력을 표시 할 때, 여러 스레드의 로깅 활동 또는 예기치 않게 충돌 할 수있는 프로그램의 로깅 활동.

또한

스폰 된 프로세스가 화면 I/O를 수행하는 경우 std :: 시스템으로 호출하기 전에 std :: cout의 명시 적 플러시가 필요합니다. STD :: CIN의 입력, std :: CERR에 대한 출력 또는 프로그램 종료가 std :: cout에 대한 호출을 강제하기 때문에 STD :: Cout과 함께 사용하면 대부분의 다른 일반적인 대화식 I/O 시나리오에서 STD :: ENDL이 중복됩니다. .플러시(). 일부 소스에 의해 장려되는 ' n'대신 std :: endl을 사용하면 출력 성능이 크게 저하 될 수 있습니다.

자신의 노트북 이외의 다른 방법으로 프로그램을 실행하려는 경우 절대 사용하지 마십시오. endl 성명. 특히 짧은 줄을 많이 쓰거나 파일에 단일 문자를 자주 보았을 때. 사용 endl NFS와 같은 네트워크 파일 시스템을 죽이는 것으로 알고 있습니다.

그만큼 endl 조작기는 동일합니다 '\'. 하지만 endl 항상 스트림을 플러시합니다.

std::cout << "Test line" << std::endl; // with flush
std::cout << "Test line\n"; // no flush

눈치 채지 못했다면 endl Enter 키를 누르는 것과 같습니다 "\n" Enter 키 + 우주선을 누르는 것과 같습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top