首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C++是否可以重用fstream打开和写入多个文件?

C++是否可以重用fstream打开和写入多个文件?
EN

Stack Overflow用户
提问于 2010-02-18 06:09:20
回答 3查看 33.7K关注 0票数 23

我有10个文件需要打开写入的顺序。我可以有一个fstream来做这件事吗?我是否需要在每个文件之间做一些特殊的事情(除了flush()),或者只是为每个文件调用open(file1, fstream::out | std::ofstream::app),并在所有10个文件都被写入的末尾关闭流。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-02-18 06:13:13

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

代码语言:javascript
复制
std::ofstream file("1");
// ...
file.close();
file.clear(); // clear flags
file.open("2");
// ...

// and so on

还要注意的是,你不需要在最后一次解构它;析构函数会为你做这件事(因此也会是flush()的)。这可能会成为一个很好的实用函数:

代码语言:javascript
复制
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);
}

然后你会得到:

代码语言:javascript
复制
std::ofstream file("1");
// ...
reopen(file, "2")
// ...

// and so on
票数 29
EN

Stack Overflow用户

发布于 2010-02-18 06:13:30

可以,但每次打开下一个文件之前,必须先关闭fstream。

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

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2010-02-18 06:14:47

关闭一个流意味着使用flush(),所以只要在打开下一个流之前对每个流执行close()操作就可以了。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2284775

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档