2017-02-12 30 views
3

我試圖在具有多個定界符從命令提示數據來讀取,例如:雷丁在格式化數據具有多個符C++

數據1,數據2,數據3。

我希望代碼能夠在第一個逗號之前的數據中讀取數據,之後的數據和第二個逗號之前的數據,以及最後的數據之後但在時間段之前。我一直在使用這個:

getline(cin, VAR, ','); 
cin.get(); 
getline(cin, VAR2, ' '); 
getline(cin, VAR3, ','); 
cin.get(); 
getline(cin, VAR4, '.'); 

而且它做我想要的,只要信息輸入正確。但是,如何查看信息是否不正確?因爲如果用戶沒有輸入兩個逗號和一個句點,程序會卡住,因爲我認爲cin流在找不到getline()讀取中指定的分隔符後會中斷。我試過這個:

if (cin.fail()) { 
     cout << "failure" << endl; 
} 

在getline之後,但如果未輸入分隔符,它將永不運行。做到這一點的最佳方式是什麼,檢查錯誤並查看數據是否未以所需格式輸入?

回答

2

你必須自己解析輸入。

對於初學者,您的輸入不包含「具有多個分隔符的數據」。您的輸入由一行文本組成,根據您的描述,這些文本是在某種類型的命令提示符處輸入的。

如果是這樣,那麼文本行應該用單std::getline()庫函數讀,因爲默認情況下,std::getline()使用\n作爲默認分隔符。

std::string str; 

std::getline(std::cin, str); 

現在,您已將您的輸入讀入str。現在該任務已完成,您可以開始驗證str是否包含正確格式化的輸入以及相應的分隔符。

爲此,您將使用std::string對象提供的一組豐富的方法。例如,一個這樣的方法,find(),搜索一個特定的字符,該字符串,如您的第一個逗號:

auto n=str.find(','); 

完整的文檔find(),其說明你會發現在你的C++的書,將解釋如何確定是否find()確實找到了逗號,或者不是。根據您的程序可以採取適當的措施(如果未找到逗號)或使用substr()方法,請在此str上提取逗號前的字符串部分。那將是你的第一個VAR。然後,再次使用substr()在第一個逗號之後提取輸入文本的其餘部分。

您還可以在C++書籍中找到關於substr()的完整描述。

在使用substr()提取剩餘的輸入文本後,第一個逗號後,您將簡單地重複提取data2以及下面的輸入項目,這次使用一個句點的整個過程。

而且,在每一步的過程中,您將掌握程序確定您的輸入格式是否正確所需的所有信息。

+0

這是一個很好的答案,謝謝。我以爲我可以從cin中讀取它,但這是一個更好的主意 – DudeDudeDude

0

你可以在整個行讀入一個std::string,然後用std::istringstream解析字符串:

#include <iostream> 
#include <string> 
#include <sstream> 
#include <cstdlib> 

int main(void) 
{ 
    const std::string input_text = "data1, data2, data3\n"; 
    std::istringstream input_stream(input_text); 

    std::string data1; 
    std::string data2; 
    std::string data3; 

    std::getline(input_stream, data1, ','); 
    std::getline(input_stream, data2, ','); 
    std::getline(input_stream, data3, ','); 

    std::cout << "data1: " << data1 << '\n'; 
    std::cout << "data2: " << data2 << '\n'; 
    std::cout << "data3: " << data3 << '\n'; 

    return EXIT_SUCCESS; 
} 

如果std::getline失敗,這意味着在數據中的錯誤。