我一直被一个问题困住了一段时间,似乎找不到答案。 我试图每次都创建多个名称相同但末尾编号不同的文件,我一开始只是通过使用
int seq_number = 1;
while (seq_number < 10)
{
ofstream fsave;
fsave.open("filename" + seq_number + ".txt");
fsave << "blablabla";
fsave.close();
seq_number = seq_number + 1;
}
但这给了我一个非常奇怪的结果,即字母变得困惑,我不确定它是如何工作的,但我知道它不会。
我在网上查找并找到了 stringstream 或 sstream,并尝试使用它,但它也一直给我错误,
string filename;
filename = "character";
ostringstream s;
s << filename << seq_number;
filename(s.str());
fsave.open(filename + ".txt");
fsave << "blabla"
fsave.close(;)
但我一直收到错误:
调用“(std::string) (std::basic_string, std::allocator >)”不匹配
我不确定字符串流是如何工作的,所以我是凭直觉工作的,但我很感激任何可能的方式,老实说,我想我更愿意在没有 sstream 的情况下这样做,但我需要一种方法来获得一个int 和 str 一起保存一个文件名,它是一个字符串。 除非你知道更好的方法;)谢谢大家
最佳答案
filename(s.str());
这是错误的;你不是在构建一个新变量(filename
已经构建),你在这里想要的是一个赋值。
filename = s.str();
然后,
fsave.open((filename + ".txt").c_str());
(不过,如果您使用的是 C++11,则无需进行此更改)
不过,我个人还是会用流构造整个文件名:
ostringstream s;
s<<"character"<<seq_number<<".txt";
fsave.open(s.str.c_str());
I'm not sure how string stream works exactly so im working off of instinct
这是一个非常糟糕的主意,C++ 通常是一个充满奇怪语法、段错误和未定义行为的雷区,凭本能行事通常会导致灾难。
关于你得到的错误:
fsave.open("filename" + seq_number + ".txt");
这甚至不应该编译,因为您正在将整数求和到 const char *
(因此移动“字符串的开头”),然后再次将它求和到 const char *
,这是根本不允许的。如果它是这样的,也许它可以编译:
fsave.open("filename" + seq_number);
但它不会给出所需的结果 - "filename"
是一个指针(不是 C++ 字符串),因此对它求和一个整数只会移动给定偏移量的指针。
相反,在您的第二个片段中,您使用的是一个对象 (filename
),因为它是一个函数,只有在类重载 operator()
时才允许这样做;因此,编译器会提示该对象不允许这样的操作。
关于c++ - 制作文件的顺序列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18489854/