2010-12-01 2 views
0

코드 샘플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와 동일한 형태로 인수를하지 않는 기능 PrintFError에 새로운 문자 *를 사용하지 않도록 할을 고려하십시오. 그래서 거기에 어떤 vsprintf C++에서 이에 상응하는 무엇입니까 ??

감사

답변

4

짧은 대답은하지만 boost::format이없는 기능을 제공이되지 않는 것입니다. 일반적으로 스트림을 사용하는 경우 다른 방법을 사용합니다. 확실하지 않은 경우 C++ IO 스트림에 대한 기본 자습서를 살펴보십시오.

1

표준 템플릿 라이브러리의 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; 
} 
1

당신은 그것을 필요하지 않습니다. vsprintf의 논리는 printf의 서식 논리를 직접 다시 사용할 수 없다는 것입니다. 그러나 C++에서는 std::ostream의 서식 논리를 다시 사용할 수 있습니다. 예를 들어 perror_streambuf을 작성하여 std::ostream에 넣을 수 있습니다.

관련 문제