制作文件的顺序列表

时间:2013-08-28 13:50:01

标签: c++

我一直困在一个问题上,似乎无法找到答案。 我正在尝试创建多个具有相同名称但每次最后都有不同数字的文件,我最初只是尝试使用

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

5 个答案:

答案 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()`临时获取。

使用sprintfostringstream(正如您所做)或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";
   }
}

这个(m​​odulo拼写错误)应该让你开始。

答案 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
}