亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在C ++代碼中應該使用哪個CI / O庫?

在C ++代碼中應該使用哪個CI / O庫?

C++
三國紛爭 2019-10-19 15:57:30
在新的C ++代碼中,我傾向于使用C ++ iostream庫而不是C stdio庫。我注意到有些程序員似乎堅持使用stdio,堅持認為它更具可移植性。真的是這樣嗎?有什么更好用的?
查看完整描述

3 回答

?
瀟瀟雨雨

TA貢獻1833條經驗 獲得超4個贊

型安全的。因此,分配給對象也明確檢查了分配對象的類型(在編譯時)(如果需要,則生成編譯時錯誤)。這樣可以防止運行時內存溢出或將浮點值寫入char對象等。


另一方面,scanf()/ printf()和family依賴程序員獲取正確的格式字符串,并且沒有類型檢查(我相信gcc具有擴展名可以幫助您)。因此,它是許多錯誤的源頭(因為程序員的分析能力不如編譯器[更不用說編譯器比人類更完美了])。


只是為了澄清Colin Jensen的評論。


自上一個標準發布以來,iostream庫一直保持穩定(我忘了實際年份,但大約是10年前)。

澄清Mikael Jansson的評論。


他提到的其他使用格式樣式的語言都有明確的保護措施,以防止C stdio庫可能(在C語言中而不是在所提到的語言中)引起運行時崩潰的危險副作用。

注意:我同意iostream庫有點冗長。但是我愿意忍受冗長的措辭以確保運行時安全。但是我們可以通過使用Boost Format Library減輕冗長。


#include <iostream>

#include <iomanip>

#include <boost/format.hpp>


struct X

{  // this structure reverse engineered from

   // example provided by 'Mikael Jansson' in order to make this a running example


    char*       name;

    double      mean;

    int         sample_count;

};

int main()

{

    X   stats[] = {{"Plop",5.6,2}};


    // nonsense output, just to exemplify


    // stdio version

    fprintf(stderr, "at %p/%s: mean value %.3f of %4d samples\n",

            stats, stats->name, stats->mean, stats->sample_count);


    // iostream

    std::cerr << "at " << (void*)stats << "/" << stats->name

              << ": mean value " << std::fixed << std::setprecision(3) << stats->mean

              << " of " << std::setw(4) << std::setfill(' ') << stats->sample_count

              << " samples\n";


    // iostream with boost::format

    std::cerr << boost::format("at %p/%s: mean value %.3f of %4d samples\n")

                % stats % stats->name % stats->mean % stats->sample_count;

}


查看完整回答
反對 回復 2019-10-19
?
繁星coding

TA貢獻1797條經驗 獲得超4個贊

太冗長了。


考慮iostream構造以執行以下操作(對于scanf同樣):


// nonsense output, just to examplify

fprintf(stderr, "at %p/%s: mean value %.3f of %4d samples\n",

    stats, stats->name, stats->mean, stats->sample_count);

那將需要類似:


std::cerr << "at " << static_cast<void*>(stats) << "/" << stats->name

          << ": mean value " << std::precision(3) << stats->mean

          << " of " << std::width(4) << std::fill(' ') << stats->sample_count

          << " samples " << std::endl;

字符串格式化是一種情況,在這種情況下,可以并且應該避免面向對象,而傾向于嵌入字符串中的格式化DSL??紤]一下Lisp format,Python的printf樣式格式或PHP,Bash,Perl,Ruby及其字符串內插。


iostream 對于該用例而言,充其量是錯誤的。


查看完整回答
反對 回復 2019-10-19
?
開心每一天1111

TA貢獻1836條經驗 獲得超13個贊

該升壓格式庫提供了printf風格的字符串格式化一個類型安全的,面向對象的替代品,到不從通常的冗長的問題遭受輸入輸出流的補充,由于巧妙地利用運營商%。如果您不喜歡使用iostream的operator <<進行格式化,我建議您考慮使用純C printf。


查看完整回答
反對 回復 2019-10-19
  • 3 回答
  • 0 關注
  • 540 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號