1

我已经被一个问题困住了一段时间,似乎无法找到答案。我试图创建多个具有相同名称但每次最后都有不同编号的文件,我一开始只是通过使用

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一起保存一个文件名,它是一个字符串。除非你知道更好的方法;)谢谢大家

4

5 回答 5

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");

这甚至不应该编译,因为您正在将一个整数与 a 相加const char *(从而移动“字符串的开头”),然后将其再次与 a 相加const char *,这根本不允许。如果它是这样的,也许它可以编译:

fsave.open("filename" + seq_number);

但它不会给出所需的结果 -"filename"是一个指针(不是 C++ 字符串),因此向它求和一个整数只会移动给定偏移量的指针。

相反,在您的第二个片段中,您使用的是一个对象 ( filename),因为它是一个函数,只有在类重载时才允许这样做operator();因此,编译器抱怨该对象不允许这样的操作。

于 2013-08-28T13:57:26.003 回答
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
}
于 2013-08-28T14:18:18.020 回答
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";
}
于 2013-08-28T13:54:32.913 回答
0

在 C++ 中,您不能将 an 转换int为字符串,或将其连接到一个 - 而不是 'char*':

"filename" + seq_number + ".txt"
^const char*    ^int      ^const char*

此外,ostream不能将文件名接收为 a string,它必须是 a const char*,您可以通过“c_str()”临时获取。

使用sprintf, ostringstream(正如你所做的那样)或 C++11to_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";
   }
}

这(模数拼写错误)应该可以帮助您入门。

于 2013-08-28T13:59:32.537 回答
0

代替

fsave.open(filename + ".txt");

fsave.open( (filename + ".txt").c_str() );

这是因为ofstream构造函数将 a 作为参数char const *,而不是 a std::string

此外,您的第一个版本会生成奇怪的文件名,因为在 C 和 C++ 中,将整数添加到char *字符数组中的简单偏移量。它不附加到字符串。

于 2013-08-28T13:53:59.147 回答