0

我正在尝试创建一个文件,其名称是一个字符串常量,但一个字符串由一个常量字符串“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参数1' toFILE* 的 const char*' freopen(const char*, const char*, FILE*)'|

我该如何解决这个问题?

4

3 回答 3

3

由于编译器错误状态,没有从 std::stringto的隐式转换char const*(即此上下文中的c 样式字符串)。

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


示例和注释

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

char const * p = result.c_str ();

请注意,如果您对托管对象(在这种情况下)进行任何修改,指向的c-style-stringstd::string::c_str将失效result,因此将返回的值存储在非临时变量中通常是不明智的。


如果您点击以下链接,您可以阅读有关该功能的更多信息

于 2012-07-13T03:28:30.040 回答
2

我有一个小应用程序可以做到这一点。有几种方法可以做到这一点..其中最简单的是

const char * newvar = stringname.c_str();
于 2012-07-13T03:29:50.157 回答
2

如果您要使用sprintf,可能最容易跳过 using 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. 如果您确实需要,对上一个问题的回答显示了如何连接cout到不同的输出文件。

于 2012-07-13T03:55:13.187 回答