我正在尝试创建一个名称为字符串常量的文件,但是一个由常量字符串组成的字符串“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 *)'|
我如何解决这个问题?
答案 0 :(得分:3)
由于编译器错误声明没有从std::string
到char 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
连接到其他输出文件。