可能重复:
C++ can I reuse fstream to open and write multiple files?
为什么不能使用一个ifstream变量打开一个文件,读取它,然后关闭它,然后打开另一个文件,读取和关闭等等? 怎么看代码(让我们说每个文件里面都有一个整数):
int k, l;
ifstream input1;
input1.open("File1.txt");
input1 >> k;
input1.close();
input1.open("File2.txt");
input1 >> l;
input1.close();
我解决问题的唯一方法是创建另一个ifstream变量。
答案 0 :(得分:15)
您可以使用相同的变量,在重用之前需要调用.clear()
来清除对象的标志:
int k,l;
ifstream input1;
input1.open("File1.txt");
input1 >> k;
input1.close();
input1.clear();
input1.open("File2.txt");
input1 >> l;
input1.close();
input1.clear();
但我建议您不要重复使用它们。如果您不希望同时拥有多个变量,则可以将每个变量保留在自己的范围内:
int k,l;
{
std::ifstream input1("File1.txt");
input1 >> k;
}
{
std::ifstream input1("File2.txt");
input1 >> l;
}
答案 1 :(得分:5)
在clear()
对象
close()
之后调用ifstream
答案 2 :(得分:3)
问题中的原始代码效果很好:
#include <fstream>
using namespace std;
int main()
{
int k, l;
ifstream input1;
input1.open("file1.txt");
input1 >> k;
input1.close();
input1.open("file2.txt");
input1 >> l;
input1.close();
}
注意,从C++0X(C ++ 11)开始,不需要调用basic_ifstream::clear()
,因为标准指定(参见C ++ 0x / 27.9.1.9)成功{{1} }应拨打basic_ifstream::open()
。
答案 3 :(得分:2)
虽然完全有可能按照你的建议做(尽管如果提取失败你可能需要清除流的错误标志),但它并不是非常优雅。在C ++中,您可以随时在需要时创建新对象,并在完成后将其丢弃。编写此代码的更系统的方法可能是在本地循环范围内:
int result;
while (true)
{
std::ifstream infile(get_random_file_name());
if (infile >> n) { break; }
// "infile" gets destroyed at the end of the scope
}
std::cout << "We found a good file, and it contains: " << n << std::endl;
您当然可以用更适合您情况的其他任何东西来替换循环逻辑。例如,根据Zero-One-Many规则,您可能在某处包含候选文件名的容器;或者你可以循环使用命令行参数。