使用一个ifstream变量来读取多个文件

时间:2011-11-15 13:29:13

标签: c++ ifstream

  

可能重复:
  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变量。

4 个答案:

答案 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规则,您可能在某处包含候选文件名的容器;或者你可以循环使用命令行参数。