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

Trying to create an output file with freopen, using non-constant string

本文关键字:非常 常量 文件 字符串 创建 freopen 输出      更新时间:2023-10-16

我正在尝试创建一个文件,该文件的名称是字符串常量,但由常量字符串"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;
}

当我试图建立告诉我以下错误:

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

我该怎么解决这个问题?

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

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


示例和注释

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

char const * p = result.c_str ();

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


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

  • cppreference.com-std::basic_string::c_str

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

const char * newvar = stringname.c_str();

如果要使用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风格的流(如sturt)。通常情况下,最好写入ostream。上一个问题的答案显示了如果您确实需要,如何将cout连接到不同的输出文件。