我有10个文件需要按顺序写入。我是否可以只使用一个fstream完成这个任务?在每个文件之间,我需要做特殊的事情吗(除了flush())?还是只需要为每个文件调用open(file1, fstream::out | std::ofstream::app)
并在所有10个文件都被写入后关闭流。
我有10个文件需要按顺序写入。我是否可以只使用一个fstream完成这个任务?在每个文件之间,我需要做特殊的事情吗(除了flush())?还是只需要为每个文件调用open(file1, fstream::out | std::ofstream::app)
并在所有10个文件都被写入后关闭流。
你需要先关闭它,因为在已打开的流上调用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
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);
}
close()
和open()
之间插入对clear()
的调用,因为状态标志没有被清除。请参阅http://gcc.gnu.org/onlinedocs/libstdc++/faq.html#faq.stream_reopening_fails以获取详细说明。 - Danilo PiazzalungaFILE
变量有类似的东西吗?我的意思是多次重复使用。特别是用于写入。fclose()
没有帮助。 - Alexandru Barbarosie