首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

这段关于处理异常输入的代码如何修改才能更优雅一些

2013-09-07 
这段关于处理错误输入的代码怎么修改才能更优雅一些?#include iostream#include vector#include cstd

这段关于处理错误输入的代码怎么修改才能更优雅一些?

#include <iostream>
#include <vector>
#include <cstdlib>

using namespace std;

struct Point
{
int x;
int y;
};

istream& operator>>( istream& is, Point& p )
{
char ch;
is >> ch;
if( ch != '(' ) {
is.putback( ch );
is.clear( ios_base::failbit );
return is;
}

char c1, c2;
int i1, i2;

is >> i1 >> c1 >> i2 >> c2;

if( !is )
return is;
if( c1 != ',' || c2 != ')' ) {
is.clear( ios_base::failbit );
return is;
}

p.x = i1;
p.y = i2;
return is;
}

ostream& operator<<( ostream& os, Point p )
{
os << '(' << p.x << ',' << p.y << ')';
return os;

}

int main()
{
vector< Point >vp( 7 );
Point p;

int index = 0;
while( index < vp.size() ) {
if( cin >> p ) {
vp[ index ] = p;
++index;
cout << "input succeed, count: " << index << endl;
}
else {
cin.clear();
cin.sync(); //这个地方好像不是非常优雅。
cout << "input error." << endl;
}
}

for( int i = 0; i < vp.size(); ++i )
cout << vp[i] << endl;

system( "pause" );
return 0;
}
感觉清空输入缓冲区的那个地方不是特别漂亮,但是我的意思不是可以跳过错误(类似“(1,p)(2,3)”这种输入不必跳过第一个读取第二个),我要的效果是一旦发现错误便不会读入任何东西。把主函数中的处理输入的代码单独放到函数里就不要说了,我知道。
我感觉那个地方应该可以弄得更好一点。另外我是想把这种错误处理的模式用到文件上,所以现在这个方法可能不是特别通用。这么说吧,我的意思就是想让这个处理错误的代码更通用。显然使用sync不是特别漂亮。还有就是这种情况:如果是从文件中读入,那么如果在这个文件中发现错误,那么就拒绝读入,然后等待用户修改好文件之后再读入或者直接读入其他的文件。
------解决方案--------------------


仅供参考

#include <stdio.h>
char s[]="123 ab\t4\n5\n6";
char *p;
char c;
int n,k;
char *ch(char cc) {
    static char s[3];

    if ('\t'==cc)
        sprintf(s,"\\t");
    else if ('\n'==cc)
        sprintf(s,"\\n");
    else
        sprintf(s,"%c",cc);
    return s;
}
void main() {
    p=s;
    while (1) {
        k=sscanf(p,"%c%n",&c,&n);
        printf("k,c,n=%d,%s,%d\n",k,ch(c),n);
        if (1==k) {
            p+=n;
        } else if (0==k) {
            printf("skip char[%s]\n",ch(p[0]));
            p++;
        } else {//EOF==k
            break;
        }
    }
    printf("End.\n");
}
//k,c,n=1,1,1
//k,c,n=1,2,1
//k,c,n=1,3,1
//k,c,n=1, ,1
//k,c,n=1,a,1
//k,c,n=1,b,1
//k,c,n=1,\t,1
//k,c,n=1,4,1
//k,c,n=1,\n,1
//k,c,n=1,5,1
//k,c,n=1,\n,1
//k,c,n=1,6,1
//k,c,n=-1,6,1
//End.

热点排行