데이터 조각을 구분하기 위해 \ 0을 사용하고 행을 구분하기 위해 \ n을 사용하는 소켓에서 큰 버퍼를 읽으려고합니다.C++ getline()은 0을 포함하는 문자열 스트림을 읽을 때 이상하게 동작합니다.
필자는 getline()이 각 행을 쉽게 얻을 수 있다고 생각했지만 이상하게 행동했습니다.
getline()의 구분 기호로 \ n을 사용하고 있습니다.
string line;
string test1 = "aaa,123\nbbb\nccc,456\n";
stringstream ss1(test1);
while(std::getline(ss1, line, '\n')) {
cout << line << endl;
}
// outputs:
// aaa,123
// bbb
// ccc,456
string test2 = "aaa\0123\0\nbbb\0\nccc\0456\0\n";
stringstream ss2(test2);
while(std::getline(ss2, line, '\n')) {
cout << line << endl;
}
// outputs:
// aaa
// 3
왜이 문제가 test2에서 발생합니까? 3은 어디에서 오는 것입니까? 이 작업을 수행하려면 \ 0을 제거해야합니까? 소켓 recv() 할 때 내 버퍼 문자열을 표시하는 더 쉽고/좋은 방법 있는가?
왜 소켓의 데이터가 처음부터 줄에 null이 있습니까? 텍스트 일 예정이라면, 널 (null)을 포함해서는 안됩니다. – Barmar
오, 나는 3이 어디서 왔는지 보았습니다. 첫 번째'\ 0'은 널이 아니며'\ 012'의 시작입니다. 이것은 캐리지 리턴입니다. 그 다음 3이 뒤 따른다. –
줄 바꾸기가 아니라 줄 바꿈입니다. CR은 '\ 015'입니다. LF는 C 개행 문자이기도합니다. – Barmar