C/C++:函数assert()、getline()

一.断言(assert)的用法:
assert 宏的原型定义在 assert.h 中,其作用是如果它的条件返回错误,则终止程序执行。

#include "assert.h" 
void assert( int expression );

assert 的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向 stderr 打印一条出错信息,然后通过调用 abort 来终止程序运行。

使用 assert 的缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销。在调试结束后,可以通过在包含 #include 的语句之前插入 #define NDEBUG 来禁用 assert 调用,示例代码如下:

#include 
#define NDEBUG 
#include

用法总结与注意事项

(1) ASSERT ()是一个调试程序时经常使用的宏,在程序运行时它计算括号内的表达式,如果表达式为FALSE (0), 程序将报告错误,并终止执行。如果表达式不为0,则继续执行后面的语句。
(2) 这个宏通常原来判断程序中是否出现了明显非法的数据,如果出现了终止程序以免导致严重后果,同时也便于查找错误。
(3) ASSERT 只有在 Debug 版本中才有效,如果编译为 Release 版本则被忽略

二. getline()的用法:
getline()的原型是istream& getline ( istream &is , string &str , char delim );
istream& is :表示一个输入流,譬如cin;
string& str :表示把从输入流读入的字符串 is 存放在这个字符串 str 中;
char delim :表示遇到这个字符停止读入,在不设置的情况下系统默认该字符为’\n’,也就是回车换行符(遇到回车停止读入)

例如:

getline(cin,line,'#');
  • 分析 while(getline(cin,line)) 语句
    首先getline从标准输入设备上读入字符,然后返回给输入流cin,注意是cin,while判断语句的真实判断对象是cin,也就是判断当前是否存在有效的输入流。即,在输入流cin保持有效地情况下,不会跳出while循环;

    很容易误以为while判断语句的判断对象是line(也就是line是否为空),若想通过直接回车(即输入一个空的line)跳出循环,这是做不到的。因为回车只会终止getline()函数的读入操作。getline()函数终止后又进行while()判断(即判断输入流是否有效,你的输入流当然有效,满足条件)

    所以 while(getline(cin,line)) 默认回车符停止读入,按Ctrl+Z或键入EOF回车即可退出循环。

  • 截取一段slam相机数据读取的部分代码:


   getline(cam_file, cur_line);  ///去除第一行说明
   while(getline(cam_file, cur_line, ',')){   //遇到' ,' 停止读入
       if(cur_line == "") break;
       num_of_imgs++;
       cam_vec.push_back(cur_line);   ///cam_vec== 每个图像的时间戳
       getline(cam_file,cur_line);
   }
   
cam_file内容为:
#timestamp [ns],filename
1403636579763555584,1403636579763555584.png
1403636579813555456,1403636579813555456.png
1403636579863555584,1403636579863555584.png
···

这段代码使用了三次getcline,分别对应不同的作用;
(1)第一次 getline(cam_file, cur_line); 将读取文件第一行的说明注释,放到cur_line中,由于之后cur_line会被覆盖,因此该行作用相当于删去第一行注释说明文字。
(2) 之后就进入while循环读取文件内容,读取每行 ‘ ,’前的string,存入cur_line,并push_back到cam_vec数组中进行保存;只要每行还含有内容(cur_line 不为空),就不会跳出while循环。
(3) 在循环内的最后一行又用了一次 getline(cam_file, cur_line),要注意,上一步的行读取只读到 ‘,’前的位置,此时会接着往下读直到换行,也就是读取每行剩下的部分cue_line==",1403636579763555584.png"。所以这个getline的作用是清除每行剩余的部分,使得下次getline的时候能开启新的一行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值