2010-12-01 10 views
0

considèrent l'exemple de codeQu'est-ce que C++ (stream) équivalent de vsprintf?

/* 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; 
} 

Je veux éviter d'utiliser de nouveau et char * en fonction PrintFError, je pensais à ostringstream mais il ne prend pas d'arguments dans la même forme que vsprintf. Donc, y at-il un équivalent vsprintf en C++?

Merci

Répondre

4

Réponse courte est qu'il n'y a pas, cependant boost::format fournit cette fonctionnalité manquante. Typiquement, avec les flux, vous adoptez une approche différente, si vous n'êtes pas sûr, jetez un oeil à un tutoriel de base sur les flux d'E/S C++.

1

Comme vous pensiez, ostringstream à partir du modèle standard bibliothèque est votre ami dans la terre de C. La syntaxe est différente de celle que vous pouvez être utilisé pour si vous êtes un développeur C, mais il est assez puissant et facile à utiliser:

#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

Vous n'avez pas besoin. La raison pour vsprintf est que vous ne pouvez pas réutiliser directement la logique de formatage de printf. Cependant, en C++, vous pouvez réutiliser la logique de formatage std::ostream. Par exemple, vous pouvez écrire un perror_streambuf et l'emballer dans un std::ostream.