在std :: basic_ifstream上编译C ++错误

时间:2012-10-28 06:09:34

标签: c++ ifstream file-handling

我应该编写一个程序,将两个文件中的数字合并,并将所有数字写入第三个文件。程序从两个不同的文件中获取输入,并将其输出写入第三个文件。每个输入文件包含从最小到最大的排序顺序的int类型的数字列表。程序运行后,输出文件将按照从最小到最大的排序顺序包含一个较长列表中两个输入文件中的所有数字。我不是100%肯定我的逻辑是正确的。 谢谢你的帮助。

  

inputFile1:

     

1 2 3 4 5 6 7 8 9 10

     

inputFile2:

     

11 12 13 14 15 16 17 18 19 20

#include <iostream>
#include <conio.h>
#include <fstream>

using namespace std;

int main()
{
int num1, num2;

ifstream inputFile;
ifstream inputFile2;
inputFile.open ("input1.txt");
inputFile2.open("input2.txt");
ofstream outputFile;
outputFile.open("output.txt");

inputFile >> num1;
inputFile2 >> num2;
while(inputFile.eof() && inputFile2.eof())
{
    if (num1 < num2)
    {
        outputFile << num1;
        inputFile >> num1;
    }
    else
    {       
        outputFile << num2;
        inputFile2 >> num2;
    }

}

inputFile.close();
inputFile2.close();
outputFile.close();

return 0;
}

3 个答案:

答案 0 :(得分:2)

如果使用标准库,则可以使用merge

int main()
{
    ifstream inputFile("input1.txt");
    ifstream inputFile2("input2.txt");
    ofstream outputFile("output.txt");

    typedef istream_iterator<int> IT;
    typedef ostream_iterator<int> OT;
    std::merge(IT(inputFile), IT(), IT(inputFile2), IT(), OT(outputFile, " "));

    outputFile.flush();
}

另请注意,i / ofstream构造函数能够在初始化期间打开文件。

答案 1 :(得分:1)

inputFile2.open();

应该是

inputFile2.close();

答案 2 :(得分:1)

inputFile2.open();显然是inputFile2.close();

的错误类型

但我担心你的逻辑是完全错误的。你还没有理解这个练习的重点。您应该同时打开输入文件和输出文件 ,并且您不应该使用数组来存储和排序数字。如果你这样做,你将不需要一个数组,根本不需要进行任何排序。这就是练习的重点。

并重复在这个论坛上已经说过至少一百万次的内容。不要使用

while (!inputFile.eof())

这是不正确的。使用

while (inputFile >> num)

这是如何进行合并的基本草图。有很多细节需要填写。

inFile1 >> num1;
inFile2 >> num2;
while (something or other)
{
  if (num1 < num2)
  {
    outFile << num1;
    inFile1 >> num1;
  }
  else
  {
    outFile << num2;
    inFile2 >> num2;
  }
}

这里有一个讽刺,'某事或其他'可能涉及使用eof()。这是使用inFile.eof()做正确的事情的一种情况。

BTW输入数据的方式不是很好。应单独对每个文件进行排序,但不应将file1中的所有数字都小于file2中的所有数字。这不是必需的。