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的時候能開啓新的一行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章