我遇到了使用C++從文件讀取msg的問題。通常人們做的是創建一個文件流,然後使用getline()
函數來獲取味精。 getline()
函數可以接受一個額外的參數作爲分隔符,以便它返回由新分隔符分隔的每個「行」,但不是默認的「\ n」。但是,這個分隔符必須是char。在我的用例中,msg中的分隔符可能與「| - |」類似,所以我嘗試獲得解決方案,以便它接受字符串作爲分隔符而不是char。使用任意分隔符從FileStream中讀取
我已經搜索了一下StackOverFlow,發現了一些有趣的帖子。 Parse (split) a string in C++ using string delimiter (standard C++) 這一個給出了一個解決方案,使用string::find()
和string::substr()
解析任意分隔符。然而,所有的解決方案假設輸入是一個字符串,而不是一個流,在我的情況下,文件流數據太大/浪費,以便一次裝入內存,因此它應該通過msg讀取msg(或msg中的大部分msg一旦)。
實際上,通過讀取gdb實現的std::getline()
函數,似乎更容易處理的情況分隔符是一個單字符。由於每次加載大量字符時,都可以搜索分隔符並將它們分開。雖然分隔符不止一個字符是不同的,但分隔符本身可能會跨越兩個不同的塊並導致許多其他角落案例。
不確定是否有其他人曾經遇到過這種要求,以及您是如何優雅地處理它的。似乎有一個像istream& getNext (istream&& is, string& str, string delim)
這樣的標準功能會很好嗎?這似乎是我的一般用例。爲什麼不在Standard庫中,這樣人們就不再單獨實現自己的版本了?
非常感謝您
帶字符串的getline需要向前看,因此它可能會比較慢。只是猜測。我們需要實現我們自己的定製getline。 – AndyG
有沒有優雅的實現。正如你所提到的,lookahead使代碼變得複雜。也許FSM是一個優雅的解決方案? –
向前看將是一個簡單的FSM哈哈,只是不像正則表達式那麼複雜。程序的要點是讀取字符,直到達到「定界符」狀態,然後將這些字符解析爲字符串。如果您只是對「有效」解決方案感興趣,可以使用「std :: vector」並進行遊戲。 「最優」解決方案會稍微困難一些。如果沒有人回答,我會寫點東西。 – AndyG