我想解析一个逐行描述一组数据的文件。每个数据由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);
看起来有点红,我怎么能简单地说呢?
答案 0 :(得分:6)
在这种情况下使用惯用法,它变得更加简单:
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
,{{1} },strtol
等)。或者,更好的是,如果您使用的是C ++ 11,请使用stoX
函数族。
答案 1 :(得分:1)
您可以使用字符串标记器How do I tokenize a string in C++?
特别是:https://stackoverflow.com/a/55680/2436175
旁注:你不需要使用atoi,你可以这样做:
int i,j;
iss >> i >> j;
(但这不会单独处理可选元素的问题)