1

warn()次のように、ファイルを開くことができない場合にエラー メッセージを出力するために、非標準関数 (BSD によって提供される) を使用しています。

std::string path = get_path() ;
std::ifstream file(path) ;
if (file.is_open()) { /* do something */ }
else {
    warn("%s", path.c_str()) ;
    // uses errno to figure out what the error was and outputs it nicely along with the filename
}

出力する場合はこれで十分ですが、文字列全体を印刷するだけでなく、別の場所で使用したい場合はどうすればよいでしょうか。関数にはwarn()、エラーを文字列に書き込むフォームがないようです。私は自分自身を転がしてみましたが、比較すると非常に面倒に思えます(プログラムの名前を取得できないことに加えて):

this->foo((boost::format("%s: %s") % path % strerror(errno)).str()) ;

warn()では、 の出力を文字列として取得するにはどうすればよいですか?

4

3 に答える 3

1
于 2013-02-26T16:08:01.527 に答える
0

回転によって次のような結果が得られるようです。

path + ": " +  strerror(errno);

推測では、含まれargv[0]ている「プログラムの名前」はおそらく.warnstd::string

std::string warn_s(std::string const &path) { 
    char *pname = strrchr(argv[0], '/');
    if (pname == NULL)
        pname = argv[0];
    return path + pname + ":  " + strerror(errno);
}

ここでの主な問題は、それargvがローカルmainであることです。そのため、メインのアクセス可能な場所に保存するか、非標準のメカニズムを使用して関数でそのデータを再取得する必要があります。

残念ながら、私が見つけたドキュメントwarnは貧弱で、その出力を正確に複製したい場合は、おそらく少しのテスト/試行錯誤が必要になるでしょう.

于 2013-02-26T16:16:13.727 に答える
0

おっしゃる通りです。sprintfアナログはありません (つまり、仮想swarn関数はありません)。

あなたのアプローチは実行可能のようです。

于 2013-02-26T16:08:29.737 に答える