2015-09-22 55 views
1

我有一個函數需要從ifstream(文件來自磁盤上的文件)或stringstream(內存中的文本)中讀取。C++從具有相同循環的ifstream或stringstream讀取

這是我想要做的一個例子:

void myFunction(bool file,stringstream& ss){ 
    ifstream inFile; 
    string oneline; 
    if (file == true){ 
    //code to open file with inFile 
    } 
    while (getline(file==true?inFile:ss, oneline)){ 
    // ..process lines 
    } 
    ... 
    ... 

不用說也不會編譯。任何人都可以提出一個適當的方式來實現這一目標?

+0

請勿使用'file == true'。如果'file'已經是'true',它會給你'true';如果'file'是'false',則給你'true,所以沒有理由去做。實際上,因爲這是C++,所以'file == true'實際上可能會給某些應該被視爲真的值提供不正確的結果。 – zstewart

+0

你是說我應該用這個代替來測試一個布爾值:if(file) – user1971455

+0

是的。它更簡潔,編碼風格更好。比如'==','!=','<'等等都會產生一個布爾值,所以如果你已經有了一個布爾值,那麼你不需要使用比較運算符來得到一個布爾值。 – zstewart

回答

3

所有iostreams類都從公共基類中派生。輸入流全部來自istream,輸出流全部來自ostream。需要處理輸入流或輸出流的最典型的功能(但並不關心它是來自文件,字符串等)只是涉及對istreamostream的引用,如下所示:

void myFunction(std::istream &is) { 
    std::string oneline; 
    while (getline(is, oneline)) 
     process(oneline); 
} 

if (file) { 
    std::ifstream inFile(filename); 
    myFunction(inFile); 
} 
else { 
    std::istringstream fromMemory(...); 
    myFunction(fromMemory); 
} 
+0

我還是很困惑。 getline(ss,oneline)工作正常,而getline(inFile,oneline)正常工作,但getline((file)?inFile:ss,oneline))失敗,錯誤:沒有匹配函數調用'getline(void *,std :: string&)'我可以用演員解決這個問題嗎? – user1971455