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

C++primer 练习8.3疑问

2013-06-26 
C++primer 习题8.3疑问{int ivalwhile(inival,!in.eof()){if(in.bad())throw std::runtime_error(IO s

C++primer 习题8.3疑问
{
   int ival;
   while(in>>ival,!in.eof()){
    if(in.bad())
        throw std::runtime_error("IO stream corrupted");
    if(in.fail()){
        std::cerr<<"bad data ,try again"<<std::endl;
        in.clear();
        in.ignore(200,' ')C++primer 练习8.3疑问;
        continue;
    }
    //读入正常
    std::cout<<ival<<" ";
   }
   in.clear();
   return in;
}


疑问:
1、读入int型的时候  如12w2,为什么会读出12,2被省略
2、为什么最后一个int数据未读出
谢谢!
[解决办法]
摒弃cin,使用scanf!
#include <stdio.h>
char s[]="123 ab 4";
char *p;
int v,n,k;
void main() {
    p=s;
    while (1) {
        k=sscanf(p,"%d%n",&v,&n);
        printf("k,v,n=%d,%d,%d\n",k,v,n);
        if (1==k) {
            p+=n;
        } else if (0==k) {
            printf("skip char[%c]\n",p[0]);
            p++;
        } else {//EOF==k
            break;
        }
    }
    printf("End.\n");
}
//k,v,n=1,123,3
//k,v,n=0,123,3
//skip char[ ]
//k,v,n=0,123,3
//skip char[a]
//k,v,n=0,123,3
//skip char[b]
//k,v,n=1,4,2
//k,v,n=-1,4,2
//End.

[解决办法]
引用:
读入数据为:
5 34  324w4 23w 33
323 23f 23 wer 234
; ?
 112
12345

ival读入12345后eof已经为true,自然不打印ival的值
[解决办法]
这是我写的读取楼主文件的C++代码:
/*
 * 读取文件中的数字
 */
#include <string>
#include <iostream>
#include <fstream>
using namespace std;

int main(int argc,char**argv){
    if(argc<2){
        cerr<<"Invaild input"<<endl;


        return -1;
    }
    ifstream fin(argv[1]);
    if(!fin){
        cerr<<"Invaild file:"<<argv[1]<<endl;
        return -2;
    }
    string line;
    string digits("0123456789");
    while(getline(fin,line)){
        cout<<"Read from file: "<<line<<endl;
        cout<<">>>>:";
        string word;
        string::size_type pos=0,pos2=0;
        while((pos2=line.find_first_of(digits,pos))!=string::npos){
            pos=line.find_first_not_of(digits,pos2);
            if(pos!=string::npos){
                word=line.substr(pos2,pos-pos2);
            }
            else{
                word=line.substr(pos2);
            }
            cout<<word<<' ';
        }
        cout<<endl;
    }

    return 0;
}

热点排行