【发布时间】:2010-02-17 22:09:20
【问题描述】:
我有 10 个文件需要打开以按顺序写入。我可以有一个 fstream 来执行此操作吗?我是否需要在每个文件之间执行任何特殊操作(flush() 除外),或者只为每个文件调用 open(file1, fstream::out | std::ofstream::app) 并在所有 10 个文件写入结束时关闭流。
【问题讨论】:
标签: c++
我有 10 个文件需要打开以按顺序写入。我可以有一个 fstream 来执行此操作吗?我是否需要在每个文件之间执行任何特殊操作(flush() 除外),或者只为每个文件调用 open(file1, fstream::out | std::ofstream::app) 并在所有 10 个文件写入结束时关闭流。
【问题讨论】:
标签: c++
您需要先将其关闭,因为在已打开的流上调用 open 会失败。 (这意味着 failbit 标志设置为 true)。注意close() 刷新,所以你不必担心:
std::ofstream file("1");
// ...
file.close();
file.clear(); // clear flags
file.open("2");
// ...
// and so on
另外注意,最后一次不需要close();析构函数为您执行此操作(因此也为flush()'s)。这可能是一个很好的实用功能:
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
【讨论】:
close() 和open() 的调用之间插入对clear() 的调用,因为不会清除状态标志。详细解释见gcc.gnu.org/onlinedocs/libstdc++/…。
FILE 变量有类似的东西吗?我的意思是多次重用。 Aspecialy 给他们写信。 fclose() 没有帮助。
关闭一个流意味着flush(),所以只要你close()每个流在你打开下一个流之前你应该没问题。
【讨论】:
是的,但每次打开下一个文件之前都必须关闭 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 语句。如果每个文件的操作相同,则可以消除该构造。
【讨论】: