簡體   English   中英

c ++將文件中的行解析為流

[英]c++ parsing lines in file as streams

我想解析一個逐行描述一組數據的文件。 每個數據由3或4個參數組成:int int float(optional)string。

我打開文件ifstream inFile並在while循環中使用它

while (inFile) {

    string line;
    getline(inFile,line);
    istringstream iss(line);


    char strInput[256];

    iss >> strInput;
    int i = atoi(strInput);

    iss >> strInput;
    int j = atoi(strInput);

    iss >> strInput;
    float k = atoi(strInput);

    iss >> strInput;

    cout << i << j << k << strInput << endl;*/


}

問題是最后一個參數是可選的,所以當它不存在時我可能會遇到錯誤。 如何提前檢查每個數據的參數數量?

此外,

    string line;
    getline(inFile,line);
    istringstream iss(line);

看起來有點紅,我怎么能簡單地說呢?

在這種情況下使用慣用法,它變得更加簡單:

for (std::string line; getline(inFile, line); ) {
    std::istringstream iss(line);
    int i;
    int j;
    float k;

    if (!(iss >> i >> j)) {
        //Failed to extract the required elements
        //This is an error
    }

    if (!(iss >> k)) {
        //Failed to extract the optional element
        //This is not an error -- you just don't have a third parameter
    }
}

順便說一句, atoi有一些非常不受歡迎的歧義,除非0不是你正在解析的字符串的可能值。 由於atoi返回0,當它的錯誤,你可以不知道,如果返回值為0是一個字符串的成功解析,值為0 ,或者,除非你做原始的字符串一些相當費力的檢查這是一個錯誤,你有它解析。

嘗試堅持使用流,但在需要回退到atoi類型功能的情況下,請使用strtoX系列函數( strtoistrtolstrtof等)。 或者,更好的是,如果您使用的是C ++ 11,請使用stoX系列函數。

你可以使用字符串標記器如何在C ++中標記字符串?
特別是: https//stackoverflow.com/a/55680/2436175

旁注:你不需要使用atoi,你可以簡單地做:

int i,j;
iss >> i >> j;

(但這不會單獨處理可選元素的問題)

暫無
暫無

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

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