尝试使用freopen创建输出文件,使用非常量字符串
Trying to create an output file with freopen, using non-constant string
我正在尝试创建一个文件,该文件的名称是字符串常量,但由常量字符串"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::string
到char 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
连接到不同的输出文件。
相关文章:
- #定义c-预处理器常量..我做错了什么
- 用C++中的一个变量定义一个常量
- 什么时候在C++中返回常量引用是个好主意
- 代理对象的常量正确性
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 通过多个头文件使用常量变量
- 在cuda线程之间共享大量常量数据
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 是默认情况下分配给char数组常量的值
- 私有类型的静态常量成员
- OpenGL大的3D纹理(>2GB)非常慢
- 类似枚举的计算常量
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 使用常量键但非常量值进行映射
- 为什么`is_open()`非常常量
- 从getter方法返回常量和非常量值
- 阻止const类函数在引用成员上调用非常常量类函数
- C++初始化非常大的常量数组,最佳实践
- 提高c++中非常大的常量的可读性