尝试使用非常量字符串使用freopen创建输出文件

时间:2012-07-13 03:20:57

标签: c++ string freopen

我正在尝试创建一个名称为字符串常量的文件,但是一个由常量字符串组成的字符串“List”一个整数+ +一个扩展名。这是我的代码:

#include <iostream>
#include <vector>
#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
using namespace std;

int main (){
            int cont=0;

            std::string result;
            std::string name = "Lista";
            std::string ext = ".txt";

            char numstr[21]; // enough to hold all numbers up to 64-bits
            sprintf(numstr, "%d", cont);
            result = name + numstr+ext;

            freopen (result, "w", stdout);
            cout<<result<<endl;
return 0;
}

当我尝试构建时告诉我以下错误:

  

错误:无法转换std::string' to const char *'作为参数1' to FILE * freopen(const char *,const char *,FILE *)'|

我如何解决这个问题?

3 个答案:

答案 0 :(得分:3)

由于编译器错误声明没有从std::stringchar const*的隐式转换(即在此上下文中的 c-style-string )。

虽然std::string有一个名为c_str成员函数,它会生成一个以null结尾的字符串并返回指向它的指针在处理遗留C函数时非常有用。


示例和说明

freopen (result.c_str (), "w", stdout);

char const * p = result.c_str ();

请注意,如果您对托管对象进行任何修改,std::string::c_str指向的 c-style-string 将无效(在本例中为result因此,将返回的值存储在非临时变量中通常是不明智的。


如果您按照以下链接

,可以详细了解该功能

答案 1 :(得分:2)

我有small app这样做。有几种方法可以做到这一点..最简单的是

const char * newvar = stringname.c_str();

答案 2 :(得分:2)

如果您要使用sprintf,最简单的方法是跳过使用std::string

char name[32];

sprintf(name, "lista%d.txt", cont);
freopen(name, "w", stdout);

如果您打算使用std::string(可能最适合大多数C ++),您可能希望使用std::stringstream来创建名称:

std::ostringstream name;

name << "lista" << cont << ".txt";

freopen(name.str().c_str(), "w", stdout);

但是,我倾向于避免freopen避免在C ++中使用C风格的流(例如stout)。写入ostream通常会更好。如果您确实需要,previous question的答案会显示如何将cout连接到其他输出文件。