本来是在ifstream上出现的问题,想读取文件信息且让文件更有可读性,到想到ifstream与cin同是basic_ios的子类,输入方法都不会太大,scanf和fscanf都是cstdio的输入,格式也没有区别,那么就用cin代替ifstream,scanf代替fscanf。
——---——---——---
假设我现在输入了以下内容:
A:1,B:2
如果我用scanf读取A:和B:后面的数据,那么可以直接用:
scanf("A:%d,B:%d",&a,&b);
那么如何用cin做到向scanf一样的效果?
不要使用cin.get(),用最简洁的办法。
#include <iostream>
struct literal
{
const char *str;
literal(const char *in) : str(in) {}
};
std::istream &operator>>(std::istream &is, const literal &lit)
{
for (const char *p = lit.str; *p; ++p)
{
if (std::isspace(*p))
std::istream::sentry s(is); // discard whitespace
else if (is.get() != *p)
is.setstate(std::ios::failbit); // stop extracting
}
return is;
}
int main()
{
int a, b;
if (std::cin >> literal("A:") >> a >> literal(",B:") >> b)
std::cout << a << ' ' << b << '\n';
else
std::cerr << "invalid format\n";
return 0;
}
$ g++ -Wall main.cpp
$ ./a.out
A:1,B:2
1 2
$ ./a.out
a:1,b:2
invalid format