假设我输入如下:
N (X_1,Y_1) (X_2,Y_2) .... (X_N, Y_N)
其中N,X_i和Y_i是整数。
一个例子:
2 (55,1) (521,7)
要读这个,我可以做这样的事情(假设所有变量都已定义,等等):
fscanf(fin,"%d ",&N);
for (int i = 0; i < N; i++)
fscanf(fin,"(%d,%d) ", &X[i], &Y[i]);
问题是,如何使用ifstream轻松完成此操作。我可以得到字符串,然后我可以摆脱nondigits并使用stringstream我可以得到两个数字,但这似乎有点麻烦。是否有更简单,更优雅的方式?
由于
答案 0 :(得分:6)
int n, x, y;
char c;
if (is >> n)
for (int i = 0; i < n; ++i)
if (is >> c && c == '(' &&
is >> x &&
is >> c && c == ',' &&
is >> y &&
is >> c && c == ')')
{
X[i] = x;
Y[i] = y;
}
else
throw std::runtime_error("invalid inputs");
您可以将上面所有重要的内部if
条件简化为......
is >> chlit('(') >> x >> chlit(',') >> y >> chlit(')')
...使用简单的支持类型来消费特定字符:
struct chlit
{
chlit(char c) : c_(c) { }
char c_;
};
inline std::istream& operator>>(std::istream& is, chlit x)
{
char c;
if (is >> c && c != x.c_)
is.setstate(std::iostream::failbit);
return is;
}
查看说明此on ideone here的完整程序。
我的一个老帖子做了类似的消费特定字符串。 (上面的chlit
可能是一个模板,但是chlit<','>()
难以读写 - 我宁愿相信编译器。)
答案 1 :(得分:3)
cin >> N;
for (int i = 0; i < N; i++)
{
cin.ignore(100,'(');
cin >> X[i];
cin.ignore(100,',');
cin >> Y[i];
cin.ignore(100,')');
}
它也可以处理空格,因为它可以读取输入,如:
2 ( 1 , 3 ) ( 5 , 6 )
在ideone上演示:http://www.ideone.com/hO0xG