2013-07-08 449 views
2

我正在使用C++中的某些TCP/IP連接設備進行通信。 設備要求發送的命令以\ r \ n結尾。C++字符串中的回車和換行

我正在使用配置文件從中讀取通信中使用的命令。

我遇到的問題是,命令\ r \ n被解釋爲4個字符,而不是回車符和換行符。

我試過使用string.data(),但我得到了與string.c_str()相同的結果。

是否有任何好的功能,讓它從一開始就正確或我必須解決這個與正常替換功能?或者我還沒有想過的其他方式?

我想,如果我找不到一個真正乾淨的方法來做到這一點,我只是省略配置文件中的\ r \ n並在之後添加它,但它將很好,所有的配置文件沒有任何硬編碼。我想我會需要做一些硬編碼,如果我試圖用正確的字符替換四個字符\ r \ n。

感謝所有幫助

編輯: 配置文件中包含像這樣的線路。

MONITOR_REQUEST = 「TVT?\ 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

聽起來像是你的配置文件實際上包含4個不同的字符'\''r''\',並... 'n'您必須更改文件(例如使用實際文件中的行結尾用於對字符串中的行結束符進行編碼,甚至某些系統也不會將\ r \ n用作文本文件行分隔符),或者按照您的建議進行替換/轉換。翻譯是更便攜的方法。它也可以非常快......只需在字符串中維護兩個指針/迭代器/索引 - 一個用於讀取位置,一個用於寫入,並在壓縮轉義符號的同時複製。

+0

是的,這是正確的。你指出有4個disticnt字符。每一行也以真正的\ r \ n結尾,但這不是命令的一部分,這也是我在閱讀配置文件時打破的。 – user1728363

+0

另一個非常好的解決方案,如果它們發生,可以輕鬆擴展以處理額外的轉義字符(例如'\ a')。在看到''\\''後,不要忘記檢查字符串的結尾。 –

1

你不需要代碼中的任何代碼。 您可以很好地從相同的配置文件中讀取要附加到傳出字符串的字符。

假設你有名稱值對你的conf文件:

APPEND_EOL = 「\ n \ r」 str_to_send1 = 「這是一個測試%% APPEND_EOL %%」

在解析行在發送之前您可以生成實際的行。 如果你不能將APPEND_EOL存儲在同一行中,那麼你可以從ENV中選擇它,如果沒有定義它,或者可能在你的另一個配置文件中。

+0

聽起來像是可能是一種選擇的東西。 – user1728363

相關問題