使用vsprintf和文件操作

时间:2015-07-31 10:36:20

标签: c++ c file printf

#define printm(X) handleVarArgs X
void writeFile(std::string & s)
{
    FILE *fp;
    fopen("test.txt","w");
    fputs( s.c_str(), fp );
    fclose(fp);
}


void handleVarArgs( char* format, ...)
{
    std::string s;
    va_list args;
    va_start (args, format);
    vsprintf (const_cast<char *>(s.c_str()),format, args);
    va_end (args);
    writeFile(s);
}


const char *  func() { 
    std::string errorLog("Kiev"); 
    return errorLog.c_str();
}

int main()
{

    printm(("My  Name is %s and surname is %s and age is %d",func(),"john",25));
    return 0;
}

如果我调用writeFile()函数,我会遇到分段错误。但是当我删除writeFile()时没有分段错误 Files和Var Args之间有什么关系?

2 个答案:

答案 0 :(得分:1)

您直接在string.c_str()中编写,只需使用const_cast删除其常量即可。这是错误并调用未定义的行为。接下来发生的事情就是 undefined ......

handleVarArgs的正确方法是:

  • 从堆中分配内存(使用malloc或new [])
  • 使用vs n printf尝试在那里写
  • 如果返回值(比如sz)大于或等于分配的大小,则释放它并重新分配一堆大小sz+1并迭代
  • 然后您可以安全地从该char数组创建std::string并使用它
  • 完成malloc&#39; ed数组后,不要伪造免费电话(或删除[])

类似的东西:

void handleVarArgs( char* format, ...)
{
#define DEF_SZ  256
    int sz = DEF_SZ;
    std::string s;
    while(1) {
        char * buf = new char[sz];
        va_list args;
        va_start (args, format);
        int l = vsnprintf (buf , sz, format, args);
        va_end (args);
        if (l < sz) {
            s = buf;
            writeFile(s);
            delete[] buf;
            return;
        }
        sz = l + 1;
        delete[] buf;
    }
}

答案 1 :(得分:0)

打开文件后fp的值是多少? 它与打开文件前的值有何关系? 调试器是你最好的朋友。

应为:FILE *fp = fopen("test.txt","w"); 没有提到你应该检查fopen成功了。