2016-12-01 7 views
0

이것은 보류 상태에있는 다른 질문에서 복사 한 질문입니다. cout에서 하나 이상의 문자열을 연결할 때 여분의 하이픈이 출력 버퍼 스트림의 시작 부분에 추가되는 이유와 왜 문자를 덮어 쓰는 지 궁금합니다.캐리지 리턴으로 인해 문자를 덮어 쓰고 순서가 바뀌어 인쇄되지 않습니다.

다음은 문자열을 인쇄 할 때 이러한 문제가 발생하는 것을 보여주는 최소한의 예입니다. 전에이 질문을 게시했지만 재현성 부족으로 보류되었습니다. 재현 할 수없는 이유는 텍스트 파일을 복사 할 때 숨겨진 문자를 복사하지 않기 때문입니다. 내가 cat -e ex.txt을 만들었을 때 어떤 이유로 든 라인이 모두 ^M으로 끝나는 것으로 나타났습니다. 이것이 문제의 원인입니다. 아래 답변.

- 폴

#include <string> 
#include <fstream> 
#include <iostream> 

using namespace std; 
int main(int argc, char* argv[]){ 
    ifstream infile(argv[1]); 
    string str; 
    getline(infile, str); 
    cout<<"str: "<<str<<"-"<<endl; 
} 

나는 컴파일과 코드 실행

-tr: Bella Abzug 
: 아래

g++ -o hw4.exe prog4.cpp 

./hw4.exe ex2.txt 

$ cat -e ex2.txt 
Bella Abzug ^M$ 

od -x ex2.txt 

0000000 6542 6c6c 2061 6241 757a 2067 0a0d 
0000016 

출력의 출력은

그러나 나는 아직도 이것이 사실 인 이유를 모른다. 줄 바꿈이 뒤따라 오는 캐리지 리턴이이 동작을 일으키는 이유는 무엇입니까?

+3

아이에게 요즘 '이동 커서를 라인의 시작', carriage return입니다. 텔레타이프가 뭔지도 모릅니다. 캐리지 리턴은 출력 위치를 현재 행의 시작으로 이동합니다. 그리고 완성을 위해 라인 피드는 출력 위치를 한 줄 아래로 이동시킵니다. 이 조합은 출력 위치를 다음 줄의 시작으로 이동시킵니다. Windows 파일에서 CR + LF를 사용하여 시작을 새 줄로 표시합니다. –

+0

하지만 '^ M $'일 때도 똑같은 일이 발생합니다. 재현 가능한 예제로 작업하기 – Paul

+0

''\ n ''은 C 계열의 언어에서 "개행 문자"입니다. ' '\ n' '을 포함하는 리터럴 텍스트가 출력 스트림에 기록 될 때, 그것은 새로운 라인을 시작하는 데 필요한 무엇이든을하도록 런타임 지원에게 알려줍니다. 이것은 런타임 지원과 컴파일러 간의 계약입니다. 그들이 동의하는 모든 값은 프로그램 텍스트에서' '\ n' '으로 표시됩니다. 이것은 종종 newline의 ASCII 표현과 같은 ** value **이지만 ASCII 코드는 아닙니다. –

답변

0
+0

그래서 캐리지 리턴을 줄 바꿈으로 "$"를 인식하지 못하는 이유는 무엇입니까? – Paul

+0

C 계열의 언어는' '$' '을 어떤 종류의 제어 문자로 취급하지 않기 때문에. ''$ ''를 나타내는 일반적인 문자입니다. 아무것도 더. –

+0

하지만 fline이 왜 내가 개행을 호출 할 때 그것을 인식합니까?당신이 다른 예를 원한다면 알려주십시오. – Paul