[英]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
系列函數( strtoi
, strtol
, strtof
等)。 或者,更好的是,如果您使用的是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.