Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用ifstream作为fscanf_C++_C_Scanf_Ifstream - Fatal编程技术网

C++ 使用ifstream作为fscanf

C++ 使用ifstream作为fscanf,c++,c,scanf,ifstream,C++,C,Scanf,Ifstream,假设我有如下输入: 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); 对于(int i=0;i

假设我有如下输入:

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);
对于(int i=0;i
问题是,如何使用ifstream轻松地做到这一点。我可以得到字符串,然后我可以摆脱非数字,使用stringstream我可以得到两个数字,但这似乎有点麻烦。有没有更简单、更优雅的方法

谢谢

…具有用于消费特定角色的简单支持类型:

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;
}
请参阅说明此问题的完整程序

我的一个老帖子在使用特定字符串时也做了类似的事情。(上面的
chlit
可以是一个模板,但是
chlit()
读写起来很难看-我宁愿相信编译器)


在ideone上演示:

为什么不直接使用scanf呢?或者你问是因为你想学习?我只是问,因为我想学=)我最后一次建议在C++程序中使用C风格IO,所有C++精英都这么做了。从3行到15…我非常喜欢C++,但是IoFi流有时很难处理。如果输入中有一些意想不到的东西,它至少不会造成内存重写。@安德斯:FSCANF停止对意外输入的扫描,并返回成功扫描的项目数。@ DealLax:重新内存覆盖,问题是很多初学者都不能防止重写字符串缓冲区。。。您可以使用诸如“%.20s”或“%.*s”之类的格式,但许多初学者不这样做。此外,他们经常尝试在需要
%[…]
的地方使用
%s
。@roe:值得警惕的一件事,但是不-除非事先更改流状态,否则流式传输到
字符也会跳过空白。
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");
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;
}
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  )