C ++可以重用fstream来打开和写入多个文件吗?

时间:2010-02-17 22:09:20

标签: c++

我需要打开10个文件才能按顺序写入。我可以有一个fstream来做这个吗?我是否需要在每个文件之间执行任何特殊操作(flush()除外),或者只为每个文件调用open(file1, fstream::out | std::ofstream::app)并在写入所有10个文件末尾时关闭流。

3 个答案:

答案 0 :(得分:23)

您需要先关闭它,因为在已打开的流上调用open会失败。 (这意味着failbit标志设置为true)。注意close()刷新,因此您无需担心:

std::ofstream file("1");
// ...
file.close();
file.clear(); // clear flags
file.open("2");
// ...

// and so on

另请注意,您最后一次不需要close();析构函数为你做了(因此也flush())。这可能是一个很好的实用功能:

template <typename Stream>
void reopen(Stream& pStream, const char * pFile,
            std::ios_base::openmode pMode = ios_base::out)
{
    pStream.close();
    pStream.clear();
    pStream.open(pFile, pMode);
}

你得到:

std::ofstream file("1");
// ...
reopen(file, "2")
// ...

// and so on

答案 1 :(得分:2)

是的,但每次打开下一个文件之前都必须关闭fstream。

但是,最好为每个文件访问使用新的作用域fstream对象,以利用构造函数和析构函数行为:

struct {
    const char *filename;
    void (*operation)(fstream&);
} filelist[] = {
    { "file1", callback1 },
    { "file2", callback2 },
    ...
    { "file10", callback10 },
};

for (int i = 0; i < 10; ++i) {
    fstream f(filelist[i].filename);
    filelist[i].operation(f);
}

在上面的代码示例中,每次通过for循环都会刷新和关闭fstream,因为当对象失去作用域时会调用析构函数。通过引用传递fstream callback function,以便可以在每个文件的基础上处理操作,而无需令人讨厌的switch语句。如果每个文件的操作相同,则可以消除该构造。

答案 2 :(得分:2)

关闭一个流意味着flush(),所以只要你在开启下一个流之前close()每个流,你应该没问题。