2013-07-08 2 views
2

C++의 일부 TCP/IP 연결 장비에 대한 통신으로 작업하고 있습니다. 장비에서 전송 된 명령이 \ r \ n으로 끝나야합니다.C++ 캐리지 리턴 및 줄 바꿈 문자

통신에 사용 된 명령을 읽는 구성 파일을 사용하고 있습니다.

문제점은 \ r \ n 명령이 캐리지 리턴 및 줄 바꿈이 아닌 4 자로 해석된다는 것입니다.

string.data()를 사용하려고했지만 string.c_str()과 같은 결과가 나타납니다.

처음부터 올바른 기능을 얻을 수 있습니까? 아니면 정상적인 바꾸기 기능으로 해결해야합니까? 아니면 내가 생각하지 못한 다른 방법?

필자가 정말로 깔끔한 방법을 찾지 못하면 구성 파일에서 \ r \ n을 생략하고 이후에 추가 할 것입니다. 그러나 구성에 모두 포함시키는 것이 좋을 것입니다 파일을 하드 코딩하지 않아도됩니다. 나는 올바른 문자로 4 개의 문자 \ r \ n을 대체하려고 시도 할 경우 몇 가지 하드 코딩을해야한다고 생각합니다. 어떤 도움

편집에 대한

감사합니다 : 설정 파일이 같은 라인이 포함되어 있습니다.

구성 파일이 실제로 4 개 별개의 문자 '\', 'r', '\''n'을 포함처럼

답변

3

구성 파일의 데이터가 변환되어야하는 경우 을 번역해야합니다. 정규 표현식 (이것에 대해서는 이 분명히 지나치게 과장 됨)이 없기 때문에이 작업을 수행하는 표준 기능을 알지 못합니다. 다음과 같이 사용합니다.

std::string 
globalReplace(
    std::string::const_iterator begin, 
    std::string::const_iterator end, 
    std::string const& before, 
    std::string const& after) 
{ 
    std::string retval; 
    std::back_insert_iterator<std::string> dest(retval); 
    std::string::const_iterator current = begin; 
    std::string::const_iterator next 
      = std::search(current, end, before.begin(), before.end()); 
    while (next != end) { 
     std::copy(current, next, dest); 
     std::copy(after.begin(), after.end(), dest); 
     current = next + before.size(); 
     next = std::search(current, end, before.begin(), before.end()); 
    } 
    std::copy(current, next, dest); 
    return retval; 
} 

마지막 인수 인 의 경우 "\\r\\n", "\r\n"으로 부를 수 있습니다 (예 :).

+0

이것은 해결 방법에 대한 옵션이 될 수도 있습니다. 처음 두 인자는 무엇입니까? – user1728363

+0

@ user1728363 변형해야하는 문자열의 시작 및 끝 반복자. –

3

이 파일을 변경해야 하나 ... 소리 MONITOR_REQUEST = "TVT? \ 연구 \ n"(실제 사용 예 문자열의 줄 끝을 인코딩하기 위해 파일의 줄 끝을 지정하고 심지어 일부 시스템은 \ r \ n을 텍스트 파일 줄 구분 기호로 사용하지 않습니다.) 또는 제안한대로 바꾸기/바꾸기를 수행하십시오. 번역은보다 휴대하기 쉬운 방법입니다. 그것은 꽤 빠를 수도 있습니다 ... 문자열에 두 개의 포인터/반복자/인덱스를 유지하십시오. 하나는 읽기 위치이고 다른 하나는 쓰기 용이고, 하나는 이스케이프 표기법을 압축하면서 건너 뜁니다.

+0

네, 맞습니다. 4 개의 문자가 있습니다. 각 행은 또한 실제 \ r \ n로 끝나지 만 명령의 일부가 아니며 구성 파일을 읽을 때 깨지기도합니다. – user1728363

+0

아주 좋은 또 다른 해결책으로, 이스케이프 처리 된 추가 문자 (예 :'\ ​​a')가있을 경우 쉽게 처리 할 수 ​​있도록 확장되었습니다. ''\\ ''를 본 후 문자열의 끝을 확인하는 것을 잊지 마십시오. –

1

코드에 코드가 필요하지 않습니다. 같은 구성 파일에서 보내는 문자열에 추가 할 문자를 아주 잘 읽을 수 있습니다. 라인을 구문 분석하는 동안

APPEND_EOL = "\ n \ r 일" 이 str_to_send1 = "이 테스트입니다 %% APPEND_EOL %%"

:

당신이 당신의 conf 파일에 이름 값 쌍을 가지고 있다고 가정 전송하기 전에 실제 라인을 생성 할 수 있습니다. APPEND_EOL을 같은 줄에 저장할 수없는 경우, 정의되지 않은 경우를 대비하여 기본값이있는 ENV 또는 다른 설정 파일에서 ENV를 선택할 수 있습니다.

+0

옵션이 될 수있는 것처럼 들립니다. – user1728363

관련 문제