【问题标题】:using one ifstream variable for reading several files [duplicate]使用一个 ifstream 变量来读取多个文件 [重复]
【发布时间】:2011-11-15 13:29:13
【问题描述】:

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

【问题讨论】:

  • 谁说不可能?这是一个技巧问题吗?
  • 您是否尝试在打开下一个文件之前调用input1.clear();
  • 这不是一个技巧,我对 c++ 很陌生当我使用我的文件时,它显然没有读取第二个。它对指针有什么作用吗?
  • 对不起,尝试了一些搜索,但没有找到特定的线程
  • @shookees:我想我想暗示的是,假设一些不确定的东西并不是一种好的哲学方法。您的问题假设这是不可能的,因此您在精神上处于不利地位,因为您已经对解决方案有偏见。询问您不熟悉的事情的更好方法是“我在哪里不明白如何做 X?”

标签: c++ ifstream


【解决方案1】:

你可以使用相同的变量,你需要调用.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;  
}

【讨论】:

  • 从 C++0X 开始,不需要调用 ifstream::clear() 因为标准规定(参见 C++0x/27.9.1.9)成功的 ifstream::open() 应该调用 ifstream::clear()。
【解决方案2】:

close() 之后对ifstream 对象调用clear()

【讨论】:

    【解决方案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)成功的basic_ifstream::open()应该调用basic_ifstream::clear() .

    【讨论】:

    • 我认为问题仍然存在。
    • @shookees 信念是不够的,我相信。此代码编译并且程序运行(它甚至读取两个示例文件)。要具体,给出细节,给出错误。您的问题远非理想,几乎无法回答(因此,我因批评您的问题不完整而得到-1,继续摆弄)。
    • 对不起,我没有-1那个,而且我的编译器当时似乎没有获得最新的标准。
    • @shookees 没关系,很抱歉误解了反对票,干杯
    【解决方案4】:

    虽然完全可以按照您的建议进行操作(尽管如果提取失败,您可能需要清除流的错误标志),但它并不是非常优雅。在 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;
    

    您当然可以用更适合您情况的任何其他内容替换循环逻辑。例如,根据零一多规则,您可能在某处有一个容器,其中包含您的候选文件名;或者你可能正在循环命令行参数。

    【讨论】:

    • 谢谢,可以尝试在当前代码中实现 :)
    猜你喜欢
    • 2021-04-04
    • 1970-01-01
    • 2019-06-25
    • 2019-12-24
    • 2021-06-25
    • 2010-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多