Bug大全(不定时更新ing)

4 篇文章 0 订阅

1、

string path ( "D:\\xxxxx.txt" ); 
ifstream inf;
    inf.open(path);
    if(!inf)
    {
        cout<<" open failed! "<<endl;
        abort();    //打开失败,结束程序
    }

执行以上程序后报错,屏幕显示“open failed !”

原因:

1)路径名错误/找不到该文件。注意文件路径一定要到“ .txt ”等后缀为止才是完整的;注意路径名中要用双斜杠“\”或是反斜杠“/”。
2)访问权限问题。文件存在于桌面文件等有访问限制的文件夹中无法读取,因此最好将文件放在普通文件夹中
3)open方法传入的数据类型错误,官方文档声明如下:

std::ifstream::open(const char* filename, 
                    ios_base::openmode mode = ios_base::in);

修正:

方法一:直接将string声明为const型

const string path( "D:\\xxxxx.txt" );

方法二:用const_cast将path修改为const char*型

inf.open( const_cast<char*>(path.c_str()) );
//c_str()将string 转成char*
//const_cast将变量转换为const类型

方法三:

CString path( _T("D:\\xxxxx.txt") );
//关于cstring的头文件,在vs中:
//cstringt.h/afx.h          MFC-only string objects
//atlstr.h                  Non-MFC string objects

2、
vector中的erase()函数要小心!
尤其在for循环中使用可能会出现数组越界!

vector<int> a = { 1, 2, 3, 4 };
    for (auto i = a.begin(); i != a.end(); i++){
        if (*i % 2 == 0)
            auto it = a.erase(i);  //此时不管用不用it来接收结果,it和i都同时指向被删除的下一个元素位置!
    }

最好这样写:

vector<int> a = { 1, 2, 3, 4 };
    for (int i = 0; i < a.size(); i++){
        if (a[i] % 2 == 0){
            a.erase(a.begin() + i);
        }
    }

注意: 如果是要和前一个元素比较的,要注意这样写:

vector<int> a = { 1, 2, 2, 2, 3 };
    for (int i = 1; i < a.size(); i++){
        if (a[i] == a[i - 1]){
            a.erase(a.begin() + i);
            i--;    //注意这个!因为此时少了一个元素了!
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值