что такое c ++ (потоковый) эквивалент vsprintf? - PullRequest
0 голосов
/ 01 декабря 2010

рассмотрим пример кода

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

Я хочу избежать использования new и char * в функции PrintFError, я думал об ostringstream, но он не принимает аргументы в той же форме, что и vsprintf.Так есть ли vsprintf эквивалент в C ++ ??

Спасибо

Ответы [ 3 ]

4 голосов
/ 01 декабря 2010

Краткий ответ: нет, однако boost::format предоставляет эту недостающую функциональность. Обычно с потоками вы выбираете другой подход, если вы не уверены, ищите базовое руководство по потокам ввода-вывода C ++.

1 голос
/ 01 декабря 2010

Тебе это не нужно. Обоснование для vsprintf заключается в том, что вы не можете напрямую использовать логику форматирования printf. Однако в C ++ вы можете повторно использовать логику форматирования std::ostream. Например, вы можете написать perror_streambuf и обернуть его в std::ostream.

1 голос
/ 01 декабря 2010

Как вы и думали, ostringstream из библиотеки стандартных шаблонов - ваш друг на земле C ++. Синтаксис отличается от того, к которому вы привыкли, если вы разработчик 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...