2010-12-01 10 views
0

私は、関数PrintFErrorに新しく文字*を使用しないようにしたいコードサンプルvsprintfに相当するC++(ストリーム)は何ですか?

/* vsprintf example */ 
#include <stdio.h> 
#include <stdarg.h> 

void PrintFError (char * format, ...) 
{ 
    char buffer[256]; 
    va_list args; 
    va_start (args, format); 
    vsprintf (buffer,format, args); 
    perror (buffer); 
    va_end (args); 
} 

int main() 
{ 
    FILE * pFile; 
    char szFileName[]="myfile.txt"; 
    int firstchar = (int) '#'; 

    pFile = fopen (szFileName,"r"); 
    if (pFile == NULL) 
    PrintFError ("Error opening '%s'",szFileName); 
    else 
    { 
    // file successfully open 
    fclose (pFile); 
    } 
    return 0; 
} 

を考え、私はostringstream考えていたが、それはvsprintfのと同じ形式で引数を取りません。だから、vsprintfはC++に相当しますか?

おかげ

答えて

4

短い答えは、しかし、boost::formatは、この不足している機能を提供し、そこではないということです。通常、ストリームでは別の方法を取っていますが、わからない場合は、C++ IOストリームに関する基本的なチュートリアルをご覧ください。

1

標準テンプレートライブラリのostringstreamは、C++の土地であなたの友人です。

#include <fstream> 
#include <string> 
#include <sstream> 
#include <cstdio> 

void print_formatted_error(const std::ostringstream& os) 
{ 
    perror(os.str().c_str()); 
} 


int main() 
{ 
    std::ifstream ifs; 
    const std::string file_name = "myfile.txt"; 
    const int first_char = static_cast<int>('#'); 

    ifs.open(file_name.c_str()); 
    if (!ifs) 
    { 
     std::ostringstream os; 
     os << "Error opening '" << file_name << "'"; 
     print_formatted_error(os); 
    } 
    else 
    { 
     // file successfully open 
    } 

    return 0; 
} 
1

あなたがそれを必要としない:構文は、Cの開発者なら、あなたがするために使用することができるが、それはかなり強力で、使いやすいとは異なります。 vsprintfの論理的根拠は、書式設定ロジックprintfを直接再利用することができないことです。ただし、C++では書式設定ロジックstd::ostreamを再利用できます。たとえば、perror_streambufと書いて、std::ostreamに書き込むことができます。

関連する問題