首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ifstream作为fscanf

使用ifstream作为fscanf
EN

Stack Overflow用户
提问于 2011-01-17 16:28:28
回答 2查看 11K关注 0票数 10

假设我有如下输入:

代码语言:javascript
复制
N (X_1,Y_1) (X_2,Y_2) .... (X_N, Y_N)

其中N、X_i和Y_i是整数。

举个例子:

代码语言:javascript
复制
2 (55,1) (521,7)

要读懂这段代码,我可以这样做(假设所有变量都已定义,等等):

代码语言:javascript
复制
fscanf(fin,"%d ",&N);
for (int i = 0; i < N; i++)
   fscanf(fin,"(%d,%d) ", &X[i], &Y[i]);

问题是,我如何使用ifstream轻松地做到这一点。我可以得到string's,然后我可以去掉非数字,使用string string我可以得到两个数字,但这看起来有点麻烦。有没有更简单、更优雅的方法?

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-01-17 16:38:39

代码语言:javascript
复制
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条件简化为...

代码语言:javascript
复制
is >> chlit('(') >> x >> chlit(',') >> y >> chlit(')')

...with一个用于消费特定字符的简单支持类型:

代码语言:javascript
复制
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<','>()读起来和写起来都很难看--我宁愿相信编译器)。

票数 7
EN

Stack Overflow用户

发布于 2011-01-17 17:29:40

代码语言:javascript
复制
cin >> N;
for (int i = 0; i < N; i++)
{
    cin.ignore(100,'(');
    cin >> X[i];
    cin.ignore(100,',');
    cin >> Y[i];
    cin.ignore(100,')');
}

它也可以处理空格,因为它可以像这样读取输入:

代码语言:javascript
复制
2  (  1  ,  3  )    (  5  ,  6  )

ideone上的演示:http://www.ideone.com/hO0xG

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4711238

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档