이것은 보류 상태에있는 다른 질문에서 복사 한 질문입니다. 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
출력의 출력은
그러나 나는 아직도 이것이 사실 인 이유를 모른다. 줄 바꿈이 뒤따라 오는 캐리지 리턴이이 동작을 일으키는 이유는 무엇입니까?
아이에게 요즘 '이동 커서를 라인의 시작', 캐리지 리턴은 출력 위치를 현재 행의 시작으로 이동합니다. 그리고 완성을 위해 라인 피드는 출력 위치를 한 줄 아래로 이동시킵니다. 이 조합은 출력 위치를 다음 줄의 시작으로 이동시킵니다. Windows 파일에서 CR + LF를 사용하여 시작을 새 줄로 표시합니다. –
carriage return
입니다. 텔레타이프가 뭔지도 모릅니다.하지만 '^ M $'일 때도 똑같은 일이 발생합니다. 재현 가능한 예제로 작업하기 – Paul
''\ n ''은 C 계열의 언어에서 "개행 문자"입니다. ' '\ n' '을 포함하는 리터럴 텍스트가 출력 스트림에 기록 될 때, 그것은 새로운 라인을 시작하는 데 필요한 무엇이든을하도록 런타임 지원에게 알려줍니다. 이것은 런타임 지원과 컴파일러 간의 계약입니다. 그들이 동의하는 모든 값은 프로그램 텍스트에서' '\ n' '으로 표시됩니다. 이것은 종종 newline의 ASCII 표현과 같은 ** value **이지만 ASCII 코드는 아닙니다. –