簡體   English   中英

檢查有效的輸入C ++

[英]Checking for valid input C++

這里的基本問題。 我正在讀取文件,並將文件中的值寫入無符號整數,如下所示:

// The essential stuff
std::ifstream infile(filePath.c_str());

std::getline(infile, line);
std::istringstream in(line);

char type;
in >> type;

unsigned int x, y, z, w;
in >> x >> y >> z >> w;  // My question relates to this here.

這是問題所在:獲得x,y,z和w的值可以正常工作,但我希望w是可選的。 因此,一行可能包含f 0 1 2 3 (類型,加上4個值),或者可能僅包含f 0 1 2

天真地,我希望w等於EOF或類似的東西,但是可惜,事實並非如此。

我可以計算行中的空格,並使用它來檢查w存在。 或者,我可以使用peek來檢查行是否在z之后結束,但這並不是那么簡單,因為我也想忽略空格(即z和w字符之間可能有10個空格,並且應該仍然有效)。 因此,肯定存在解決方案,但是我想知道是否存在……某種更簡潔的方法? 大概是這樣嗎?

writeTo(w);
if w is junk
    disposeOf(w);

分兩個步驟進行:

if (in >> x >> y >> z)
{
     mandatory_stuff(x, y, z);
     if (in >> w)
     {
         optional_stuff(w);
     }
}
else
{
     // malformed input
}

當輸入運算符失敗時,它將流設置為失敗狀態,即,它在流中設置狀態標志std::ios_base::failbit 設置此標志后,流將轉換為false ,即,您可以使用流查看輸入是否成功:

if (in >> x >> y >> z) {
    if (in >> w) {
        deal_with_all_for_values(x, y, z, w);
    }
    else {
        deal_with_only_the_first_tree(x, y, z);
    }
}

僅當讀取操作成功時才​​設置大多數值,即,如果您要給w一個特殊的值,則可以讀取該值,如果不存在,它將保留其原始值:

int w = 17;
if (in >> x >> y >> z) {
    in >> w;
    deal_with_the_values(x, y, z, w);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM