我需要實現一種機制,可以使用文本源初始化我的自定義類的向量,其中源的每一行代表我的類的一個實例。爲了達到這個目標,我爲我的班級實施了operator >>
,並實施了stringstream
。當我閱讀源代碼時,我會一行一行地獲取我原始源的子流,然後每次解析子流。這對我有三個好處。首先,通過這種方式,我可以確保文本源的一行代碼恰好代表我的課程的一個實例。其次,由於解析後的其餘部分被忽略,我可以安全地在我的文本源的任何行中添加任何註釋,這肯定會被解析器忽略。第三,我不需要在我的原始源代碼中提到向量的長度,因爲我第一次得到解析錯誤(我檢查流的fail
和bad
位以確認這一點)我知道向量聲明結束了。有效獲取stringstream的子流
剖析行由行,我用下面的代碼:
std::stringstream fullStream;
std::stringstream lineStream;
std::string str;
bool isValid;
myClass newInstance;
std::vector <myClass> result;
// Fill fullStream from external source (codepart omitted)
isValid = true;
while (isValid && ! fullStream.eof ()) {
std::getline (fullStream, str);
lineStream.clear ();
lineStream.str (str);
lineStream >> newInstance;
isValid = ! lineStream.fail ();
if (isValid) {
result.push_back (newInstance);
}
}
雖然這個代碼工作正常,我不知道是否有更好的方法來達到同樣的效果。特別是,如果從fullStream
到lineStream
有更高效的方法提取行。
感謝,
亞當
僅僅用迭代器掃描輸入字符串,而不是使用兩個(如果不是三個不同的流)會不會簡單得多?在你的地方,我將你的提取操作符的邏輯移動到一個簡單的函數,它將一個字符串迭代器對作爲參數並擺脫流。我相信你的代碼會更清晰。 –
我正在使用'operator >>',因爲這樣所有的whitespace-management和string-> float轉換都是自動處理的。我不知道如何在不使用'stringstream'的情況下實現這個功能。 –
我明白你的觀點。 –