我一直困在一个问题上,似乎无法找到答案。 我正在尝试创建多个具有相同名称但每次最后都有不同数字的文件,我最初只是尝试使用
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&gt;)'
我不确定字符串流是如何工作的,所以即时工作本能,但我会很感激,这是可能的,老实说,我想我更喜欢没有sstream,但我需要一种方法来获得一个int和str一起保存一个字符串的文件名。 除非你知道更好的方式;)谢谢你们
答案 0 :(得分:2)
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());
我不确定字符串流是如何工作的,所以我的本能
这是一个非常糟糕的主意,C ++通常是一个奇怪的语法,段错误和未定义的行为的雷区,本能通常会导致灾难。
关于您获得的错误:
fsave.open("filename" + seq_number + ".txt");
这甚至不应该编译,因为你将一个整数求和到const char *
(从而移动“字符串的开头”),然后将它再次加总为const char *
,这是根本不允许。也许它可以编译,如果它是这样的:
fsave.open("filename" + seq_number);
但是它不会给出所需的结果 - "filename"
是一个指针(不是C ++字符串),所以将一个整数加到它只是移动给定偏移量的指针。
在您的第二个代码段中,您使用的是一个对象(filename
),因为它是一个函数,只有在类重载operator()
时才允许这样做。因此,编译器抱怨该对象不允许这样的操作。
答案 1 :(得分:0)
替换
fsave.open(filename + ".txt");
使用
fsave.open( (filename + ".txt").c_str() );
这是因为ofstream
构造函数将char const *
作为参数,而不是std::string
。
此外,您的第一个版本会生成奇怪的文件名,因为在C和C ++中,向char *
添加一个整数只是在字符数组中偏移。它不附加到字符串。
答案 2 :(得分:0)
你可以这样做:
ostringstream s;
s << "character" << seq_number << ".txt";
fsave.open(s.str());
fsave << "blabla";
fsave.close();
这就是你如何实现原始循环:
for (int seq_number = 1; seq_number<10; ++seq_number)
{
ostringstream s;
s << "filename" << seq_number << ".txt";
ofstream fsave(s.str());
fsave << "blablabla";
}
答案 3 :(得分:0)
在C ++中,您无法将int
转换为字符串,或将其连接到一个字符串 - 而不是'a * *:
"filename" + seq_number + ".txt"
^const char* ^int ^const char*
此外,ostream
无法将文件名作为string
接收,它必须是const char*
,您可以通过'c_str()`临时获取。
使用sprintf
,ostringstream
(正如您所做)或C ++ 11 to_string
来做到这一点:
#include <string>
#include <iostream>
int main() {
for(int seq_number = 1; i<10; ++i) {
std::string num_as_string = std::to_string(seq_number); // make a string, C++11
std::string filename = "abcd" + num_as_string + ".txt";
std::ostream f(filename.c_str());
f << "text\n";
}
}
这个(modulo拼写错误)应该让你开始。
答案 4 :(得分:0)
你可以这样做:
#include <iostream>
#include <string>
#include <sstream>
int main (int argc, char const* argv[])
{
std::string filename;
int seq_number = 10;
filename = "character";
std::stringstream s;
s << filename << seq_number << ".txt";
filename = s.str();
std::cout<< filename << std::endl; // <-- Here open your file instead print the filename
}